Lấy danh sách các tệp trong thư mục Tài nguyên - iOS


85

Giả sử tôi có một thư mục trong thư mục "Tài nguyên" của ứng dụng iPhone có tên "Tài liệu".

Có cách nào để tôi có thể lấy một mảng hoặc một số loại danh sách của tất cả các tệp được bao gồm trong thư mục đó tại thời điểm chạy không?

Vì vậy, trong mã, nó sẽ giống như sau:

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

Điều này có khả thi không?

Câu trả lời:


139

Bạn có thể lấy đường dẫn đến Resourcesthư mục như thế này,

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

Sau đó nối Documentsđường dẫn vào đường dẫn,

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

Sau đó, bạn có thể sử dụng bất kỳ API danh sách thư mục nào của NSFileManager.

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

Lưu ý : Khi thêm thư mục nguồn vào gói, hãy đảm bảo bạn chọn "Tạo tham chiếu thư mục cho bất kỳ tùy chọn thư mục đã thêm nào khi sao chép"


2
hấp dẫn. mà không cần nối nó đã hoạt động và tìm thấy mọi thứ (bao gồm cả thư mục Documents). nhưng với append đó, "directoryOfContents" mảng là null
CodeGuy

ồ chờ đã, "Tài liệu" là một "Nhóm" không phải là một thư mục. hm. làm cách nào để thêm một thư mục vào thư mục tài nguyên của tôi?
CodeGuy

Bạn có thể Drag & Dropmột thư mục vào dự án và nội dung sẽ được sao chép qua. Hoặc Thêm một Copy Filesgiai đoạn xây dựng và chỉ định thư mục để sao chép trong đó.
Deepak Danduprolu

được rồi, tôi đã kéo nó vào. Nhưng nó vẫn cho rằng thư mục trống. hm.
CodeGuy

4
Bạn đã chọn Create folder references for any added folderstùy chọn khi sao chép?
Deepak Danduprolu

27

Nhanh

Đã cập nhật cho Swift 3

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

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

Đọc thêm:


4
Error Domain = NSCocoaErrorDomain Code = 260 "Thư mục" Tài nguyên "không tồn tại." UserInfo = {NSFilePath = / var / container / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Folder), NSUnderlying CodeError = 0x1c4450140 {Error Domain = NSPOSIXError tệp hoặc thư mục "}}
Argus

18

Bạn cũng có thể thử mã này:

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

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

bạn đang phân bổ một mảng trong directoryContents được ngay lập tức ghi đè bởi một lợi nhuận mảng bởi contentsOfDir ...
Joris Weimar

Những gì tôi muốn hiển thị chỉ là một mảng chứa nội dung của thư mục. Mảng ở đó chỉ là ví dụ. Tôi đã chỉnh sửa nó một chút.
neowinston

15

Phiên bản Swift:

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

7

Liệt kê tất cả các tệp trong một thư mục

     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
     }

Liệt kê đệ quy các tệp trong một thư mục

      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];
       }
     }

Để biết thêm về NSFileManager tại đây


3
Nó sẽ không hoạt động nếu bộ mở rộng có dấu '.'. Nói cách khác, điều này sẽ hoạt động: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun

4

Swift 3 (và các URL trả về)

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

3

Swift 4:

Nếu bạn phải làm với các dòng con "Liên quan đến dự án" (thư mục màu xanh lam), bạn có thể viết:

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

Cách sử dụng :

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

Chính xác những gì tôi đang tìm kiếm. Cảm ơn !!
rogerstone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.