การรับรายชื่อไฟล์ในโฟลเดอร์ทรัพยากร - iOS


85

สมมติว่าฉันมีโฟลเดอร์ในโฟลเดอร์ "ทรัพยากร" ของแอปพลิเคชัน iPhone ของฉันชื่อ "Documents"

มีวิธีใดบ้างที่ฉันจะได้รับอาร์เรย์หรือรายการบางประเภทของไฟล์ทั้งหมดที่อยู่ในโฟลเดอร์นั้นในขณะทำงาน

ดังนั้นในรหัสจะมีลักษณะดังนี้:

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

เป็นไปได้หรือไม่

คำตอบ:


139

คุณจะได้รับเส้นทางไปยังResourcesไดเร็กทอรีเช่นนี้

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

จากนั้นต่อท้ายDocumentsเส้นทาง

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

จากนั้นคุณสามารถใช้ใด ๆ NSFileManagerของไดเรกทอรีรายชื่อของ

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

หมายเหตุ : เมื่อเพิ่มโฟลเดอร์ซอร์สลงในบันเดิลโปรดแน่ใจว่าคุณได้เลือก "สร้างการอ้างอิงโฟลเดอร์สำหรับตัวเลือกโฟลเดอร์ที่เพิ่มเมื่อทำการคัดลอก"


2
น่าสนใจ. โดยไม่ต้องต่อท้ายมันใช้งานได้และพบทุกอย่าง (รวมถึงโฟลเดอร์ Documents) แต่ด้วยการต่อท้ายอาร์เรย์ "directoryOfContents" จึงเป็นโมฆะ
CodeGuy

เดี๋ยวก่อน "Documents" คือ "Group" ไม่ใช่โฟลเดอร์ หืม ฉันจะเพิ่มโฟลเดอร์ในโฟลเดอร์ทรัพยากรได้อย่างไร
CodeGuy

คุณสามารถDrag & Dropโฟลเดอร์ไปยังโครงการและเนื้อหาจะถูกคัดลอกไป หรือเพิ่มCopy Filesเฟสการสร้างและระบุไดเร็กทอรีที่จะคัดลอก
Deepak Danduprolu

โอเคฉันลากมันเข้ามา แต่มันก็ยังคิดว่าไดเร็กทอรีว่าง หืม
CodeGuy

4
คุณได้เลือกCreate folder references for any added foldersตัวเลือกเมื่อทำการคัดลอกหรือไม่?
Deepak Danduprolu

28

4
Error Domain = NSCocoaErrorDomain Code = 260 "ไม่มีโฟลเดอร์" Resources "" UserInfo = {NSFilePath = / var / container / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Folder), NSUnderlyingError = 0x1c4450140 {Error Domain = NoSPOS such Code " file หรือ 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);

คุณกำลังจัดสรรอาร์เรย์ในไดเร็กทอรีContentsที่ถูกเขียนทับทันทีโดยอาร์เรย์ที่ส่งคืนโดย 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
มันจะไม่ทำงานถ้าส่วนขยายมี "." กล่าวอีกนัยหนึ่งสิ่งนี้จะใช้ได้: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun

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

Swift 4:

หากคุณต้องทำกับ subdirs "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..
}

สิ่งที่ฉันกำลังมองหา ขอบคุณ !!
rogerstone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.