2013-08-24 2 views
1

Windows에서 내 응용 프로그램에 사용하고있는 가상 시스템 (VFS)을 작성했습니다. 이제는 응용 프로그램을 iOS로 옮겼고 dirrent와 관련된 문제가 있습니다.iOS - dirent.h - 현재 디렉토리 이름

Windows 포트는 파일이있는 현재 폴더에 대한 정보를 추가했습니다.

DIR * dir = opendir(dirName); 
char * dirFullPath = dir->patt; //this is missing at iOS 

어떻게 정보를 얻을 수 있습니까? DirName 변수는 유일한 상대 경로이므로 쓸모가 없습니다.

둘째, Windows에서 내 VFS의 루트로 매핑 할 폴더를 지정합니다. iOS에서도 동일한 작업을 수행하려면 어떻게해야합니까? 말하자면, VFS를 디렉토리 DATA에 매핑하십시오.

+0

경로에 문자열을 사용하지 마십시오. 그것은 나쁜 생각입니다. NSURL을 사용해야합니다. 필자 자신의 C++ 래퍼를 자유롭게 작성할 수는 있지만 iOS 용으로 컴파일 할 때는 NSURL을 사용해야합니다. 귀하의 웨이퍼는 Windows 또는 다른 플랫폼에서 권장 API를 사용하십시오. –

+0

나는 char *에 아무런 문제가 보이지 않는다. NSURL은 ANSI C++과 호환되지 않으며이 솔루션은 엉망이됩니다. 이제는 동일한 코드가 있으며 사소한 변경으로 어디에서나 이식 할 수 있습니다. –

답변

1

NSSearchPathForDirectoriesInDomains을 (아이폰 OS 섹션을 참조하십시오) 당신이 어떤 특별한 이유가 필요하지 않는 한 피해야한다 낮은 수준의 API이다. 대신 NSURL을 사용해야합니다. 이는 애플의 공식 추천 :

NSSearchPathForDirectoriesInDomains 기능은 URLsForDirectory처럼 동작 : inDomains : 방법하지만 문자열 기반 경로로 디렉토리의 위치를 반환합니다. 대신 URLsForDirectory : inDomains : 메소드를 사용해야합니다.

는 다음과 같이 사용되는 :

NSURL *documentsURL = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject; 

NSURL 객체 당신이 원하는 것을 정확히 않습니다 : 그것은 다음 기본 URL이 포함 된 객체와 그 아래의 상대 URL입니다.

크로스 플랫폼 앱을 작성하는 경우 크로스 플랫폼이 아닌 모든 것을 둘러싼 래퍼를 작성해야하며 파일 시스템 작업은 추상화해야 할 사항 중 하나입니다. NSURL 및 NSFileManager 주위에 C++ 래퍼를 작성하고 래퍼가 다른 플랫폼에서 다른 것을 사용하게하십시오.

NSURL은 일반적으로 안정성이 뛰어나고 문자열 사용에 비해 RAM 사용량이 적습니다. 종종 저수준 파일 시스템/섹터 참조를 사용합니다.

+0

은 크로스 플랫폼이 아닌 모든 것을 래퍼로 작성해야합니다. 이는 완전히 사실이 아닙니다. dirent.h는 파일 시스템 작업을위한 C 유닉스 라이브러리이며 잘 동작합니다. 저에게있어서 유일한 문제는 시작 디렉토리를 찾는 것입니다. 나는 문제없이 코드로 전체 파일 시스템을 출력 할 수있다 (나는 또한 아카이브 지원이있다). NSURL은 더 안전 할 수 있지만 문자열은 멀티 플랫폼입니다. –

+0

@MartinPerry 네,하지만 유닉스 파일 시스템 라이브러리는 OS X과 IOS에서 더 이상 사용되지 않습니다. FSRef와 NeXT가 표준 유닉스 라이브러리를 사용했다면 역사는 맥 오에스 9/클래식이다. 두 가지 모두 장단점이 다르다. 당신은 그 중 하나 (그리고 많은 사람들이 아직도 할) 중 하나를 사용할 수 있지만 NSURL은 두 API의 강점을 합병하기 위해 만들어졌으며 사용하고 있어야합니다. 더 빨라지고, 더 많은 기능을 제공하며, 버그/잡아가 적습니다. dirent.h는 전체 디스크 암호화 및 파일 시스템 인 타이틀먼트와 같은 일부 사항을 제대로 지원하지 않습니다. –

+0

예.하지만 UNIX 라이브러리도 정상적으로 작동합니다. Deprecated! = not working :) 그리고 말했듯이, NSURL을 사용하기 위해 전체 VFS를 다시 작성하는 것은 UNIX libs가 작동하는 한 내 관점에서 볼 때, 너무 복잡하고 내 관점에서도 무의미합니다. –

0

`NSFileManager는 파일 시스템에 표준 iOS 인터페이스를 제공하므로 NSFileManager를 참조하십시오.

https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html

뿐만 아니라, 철저하게이 문제를 이해해야합니다.

https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemProgrammingGuide.pdf

()

+0

Objective-C를 사용하지 않지만 C++ ... NSFileManager는 Objective-C 전용이므로 쓸모가 없습니다. –

+5

의도적으로 가장 고통스러운 개발 경로를 선택하는 것처럼 들립니다. 그걸로 행운을 빌어 요 (풍자가 아니라 - 이것은 분명히 외계인의 길입니다.하지만 길을 따라 많은 것을 배우게 될 것입니다). 아마도 iOS의 NSFileManager에 의해 뒷받침되는 FS 작업에 대한 C++ 래퍼가 가장 좋을 것입니다. – bbum

+0

'당신이 의도적으로 가장 고통스러운 개발 경로를 선택하는 것 같아요. - iOS, Android, Windows, Linux 용 다중 애플리케이션을 만들고 있습니다. 따라서 대부분의 코드는 ANSI C++이어야합니다. 덜 원시 코드 (Objective-C, Java, C# ..)로 작성할 필요가 없으므로 –