Kaynaklar klasöründeki dosyaların listesini alma - iOS


85

İPhone uygulamamın "Kaynaklar" klasöründe "Belgeler" adında bir klasörüm olduğunu varsayalım.

Çalışma zamanında bu klasöre dahil olan tüm dosyaların bir dizisini veya bir tür listesini almanın bir yolu var mı?

Yani kodda şöyle görünür:

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

Mümkün mü?

Yanıtlar:


139

ResourcesDizinin yolunu şu şekilde alabilirsiniz ,

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

Sonra Documentsyolun sonuna ekleyin ,

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

Ardından, API’lerini listeleyen herhangi bir dizini kullanabilirsiniz NSFileManager.

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

Not : Pakete kaynak klasör eklerken "Kopyalarken eklenen klasörler için klasör referansları oluştur" seçeneğini belirlediğinizden emin olun.


2
ilginç. ekleme olmadan çalıştı ve her şeyi buldu (Belgeler klasörü dahil). ancak bu ekleme ile "directoryOfContents" dizisi boştur
CodeGuy

oh bekleyin, "Belgeler" bir "Grup" bir klasör değil. hm. kaynaklar klasörüme nasıl klasör eklerim?
CodeGuy

Şunları yapabilirsiniz Drag & Dropproje üzerine klasör ve içerikleri üzerinde kopyalanır. Veya Bir Copy Filesoluşturma aşaması ekleyin ve içinde kopyalanacak dizini belirtin.
Deepak Danduprolu

tamam, içeri sürükledim. ama yine de dizinin boş olduğunu düşünüyor. hm.
CodeGuy

4
Eğer seçtiniz Create folder references for any added folderskopyalarken seçeneği?
Deepak Danduprolu

28

Swift

Swift 3 için güncellendi

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

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

Daha fazla okuma:


4
Error Domain = NSCocoaErrorDomain Code = 260 "" Kaynaklar "klasörü mevcut değil." UserInfo = {NSFilePath = / var / container / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Klasör), NSUnderlyingError böyle = 0x1c4450140 {Hata Etki AlanıD = NSPOSIX dosya veya dizin "}}
Argus

18

Bu kodu ayrıca deneyebilirsiniz:

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

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

dizine bir dizi ayırıyorsunuz, bir dizi tarafından hemen üzerine yazılan içerikler
Joris Weimar

Göstermek istediğim şey sadece dizinin içeriğini tutan bir diziydi. Dizi sadece örnek olarak orada. Biraz düzenledim.
neowinston

15

Swift versiyonu:

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

7

Bir Dizindeki Tüm Dosyaları Listeleme

     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
     }

Bir Dizindeki Dosyaları Yinelemeli Olarak Numaralandırma

      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 hakkında daha fazla bilgi için burada


3
Eklentide '.' Varsa çalışmaz. Başka bir deyişle, bu işe yarayacaktır: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun

4

Swift 3 (ve dönen URL'ler)

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:

"Projeye göre" (mavi klasörler) alt dizinleri ile yapmak zorundaysanız şunu yazabilirsiniz:

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

Kullanım :

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

Tam aradığım şey. Teşekkürler !!
rogerstone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.