リソースフォルダ内のファイルのリストを取得する-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
面白い。追加せずに動作し、すべて(Documentsフォルダーを含む)が見つかりました。しかし、その追加により、「directoryOfContents」配列はnullになります
CodeGuy 2011年

「ドキュメント」は「グループ」であり、フォルダではありません。うーん。リソースフォルダにフォルダを追加するにはどうすればよいですか?
CodeGuy 2011年

あなたはできるDrag & Dropプロジェクトへのフォルダと内容がコピーされます。またはCopy Filesビルドフェーズを追加し、コピーするディレクトリを指定します。
Deepak Danduprolu 2011年

さて、私はそれをドラッグしました。しかし、それでもディレクトリは空であると考えています。うーん。
CodeGuy 2011年

4
Create folder references for any added foldersコピー時にオプションを選択しましたか?
Deepak Danduprolu 2011年

27

迅速

Swift3用に更新

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

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

参考文献:


4
エラードメイン= NSCocoaErrorDomainコード= 260「フォルダ「リソース」は存在しません。」UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources、NSUserStringVariant =(Folder)、NSUnderlyingError = 0x1c4450140 {Error Domain = NSPOSIXErrorDomain Code = 2 "No suchファイルまたはディレクトリ "}}
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);

あなたは...すぐにcontentsOfDirによって配列を返すによって上書きされdirectoryContentsの配列を割り当てている
ヨリス・ワイマール

私が示すつもりだったのは、ディレクトリの内容を保持する配列だけでした。配列は、例のためにあります。少し編集しました。
ネオウィンストン2014

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 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:

「プロジェクトに関連するサブディレクトリ(青いフォルダ)を使用する必要がある場合は、次のように記述できます。

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。ありがとう!
ロジャーストーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.