Resources 폴더에있는 파일 목록 가져 오기-iOS


85

iPhone 응용 프로그램의 "Resources"폴더에 "Documents"라는 폴더가 있다고 가정 해 보겠습니다.

런타임에 해당 폴더에 포함 된 모든 파일의 배열 또는 일부 유형의 목록을 가져올 수있는 방법이 있습니까?

따라서 코드에서는 다음과 같습니다.

NSMutableArray *myFiles = [...get a list of files in Resources/Documents...];

이것이 가능한가?

답변:


139

다음 Resources과 같이 디렉토리 경로를 얻을 수 있습니다 .

NSString * resourcePath = [[NSBundle mainBundle] resourcePath];

그런 다음 Documents경로에를 추가하고

NSString * documentsPath = [resourcePath stringByAppendingPathComponent:@"Documents"];

그런 다음의 디렉토리 목록 API를 사용할 수 있습니다 NSFileManager.

NSError * error;
NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsPath error:&error];

참고 : 번들에 소스 폴더를 추가 할 때 "복사 할 때 추가 된 폴더에 대한 폴더 참조 생성 옵션"을 선택해야합니다.


2
흥미 롭군요. 추가하지 않고도 작동하고 모든 것을 찾았습니다 (문서 폴더 포함). 하지만 추가하면 "directoryOfContents"배열은 null입니다.
CodeGuy

잠깐만 요. "문서"는 폴더가 아니라 "그룹"입니다. 흠. 내 리소스 폴더에 폴더를 추가하려면 어떻게합니까?
CodeGuy

당신은 할 수 있습니다 Drag & Drop프로젝트 상에 폴더와 내용이 복사됩니다. 또는Copy Files 빌드 단계를 추가하고 복사 할 디렉토리를 지정합니다.
Deepak Danduprolu 2011 년

좋아, 나는 그것을 끌어 들였다. 그러나 그것은 여전히 ​​디렉토리가 비어 있다고 생각한다. 흠.
CodeGuy 2011-06-18

4
Create folder references for any added folders복사 할 때 옵션 을 선택하셨습니까 ?
Deepak Danduprolu 2011 년

27

빠른

Swift 3 업데이트

let docsPath = Bundle.main.resourcePath! + "/Resources"
let fileManager = FileManager.default

do {
    let docsArray = try fileManager.contentsOfDirectory(atPath: docsPath)
} catch {
    print(error)
}

추가 읽기 :


4
오류 도메인 = NSCocoaErrorDomain Code = 260 ""Resources "폴더가 없습니다." UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Folder), NSUnderlyingError = 0x1c4450140 {Error Domain = NSPOSIXErrorDomain Code = 2 "아니요 file or directory "}}
Argus

18

이 코드를 시도해 볼 수도 있습니다.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError * error;
NSArray * directoryContents =  [[NSFileManager defaultManager]
                      contentsOfDirectoryAtPath:documentsDirectory error:&error];

NSLog(@"directoryContents ====== %@",directoryContents);

배열에 의해 즉시 덮어 쓰여진 directoryContents에 배열을 할당하고 있습니다. contentsOfDir에 의해 반환됩니다 ...
Joris Weimar

내가 보여 주려는 것은 디렉토리의 내용을 담을 배열 일 뿐이었다. 배열은 예를 들어 거기에 있습니다. 나는 그것을 약간 편집했습니다.
neowinston

15

Swift 버전 :

    if let files = try? FileManager.default.contentsOfDirectory(atPath: Bundle.main.bundlePath ){
        for file in files {
            print(file)
        }
    }

7

디렉토리의 모든 파일 나열

     NSFileManager *fileManager = [NSFileManager defaultManager];
     NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
     NSArray *contents = [fileManager contentsOfDirectoryAtURL:bundleURL
                           includingPropertiesForKeys:@[]
                                              options:NSDirectoryEnumerationSkipsHiddenFiles
                                                error:nil];

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension ENDSWITH '.png'"];
     for (NSString *path in [contents filteredArrayUsingPredicate:predicate]) {
        // Enumerate each .png file in directory
     }

디렉터리의 파일을 재귀 적으로 열거

      NSFileManager *fileManager = [NSFileManager defaultManager];
      NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
      NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:bundleURL
                                   includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
                                                     options:NSDirectoryEnumerationSkipsHiddenFiles
                                                errorHandler:^BOOL(NSURL *url, NSError *error)
      {
         NSLog(@"[Error] %@ (%@)", error, url);
      }];

      NSMutableArray *mutableFileURLs = [NSMutableArray array];
      for (NSURL *fileURL in enumerator) {
      NSString *filename;
      [fileURL getResourceValue:&filename forKey:NSURLNameKey error:nil];

      NSNumber *isDirectory;
      [fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];

       // Skip directories with '_' prefix, for example
      if ([filename hasPrefix:@"_"] && [isDirectory boolValue]) {
         [enumerator skipDescendants];
         continue;
       }

      if (![isDirectory boolValue]) {
          [mutableFileURLs addObject:fileURL];
       }
     }

NSFileManager에 대한 자세한 내용은 여기


3
extenison에 '.'가 있으면 작동하지 않습니다. 즉, 다음과 같이 작동합니다. [NSPredicate predicateWithFormat : @ "pathExtension ENDSWITH 'png'"];
Liangjun 2014

4

Swift 3 (및 반환 URL)

let url = Bundle.main.resourceURL!
    do {
        let urls = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys:[], options: FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)
    } catch {
        print(error)
    }

3

스위프트 4 :

"Relative to project" (파란색 폴더) 하위 디렉토리와 관련하여 다음과 같이 작성할 수 있습니다.

func getAllPListFrom(_ subdir:String)->[URL]? {
    guard let fURL = Bundle.main.urls(forResourcesWithExtension: "plist", subdirectory: subdir) else { return nil }
    return fURL
}

사용법 :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}

내가 찾고 있던 Exaclty. 감사 !!
rogerstone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.