Obtendo uma lista de arquivos na pasta Recursos - iOS

85

Digamos que eu tenha uma pasta na pasta "Recursos" do meu aplicativo para iPhone chamada "Documentos".

Existe uma maneira de obter uma matriz ou algum tipo de lista de todos os arquivos incluídos nessa pasta em tempo de execução?

Portanto, no código, seria semelhante a:

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

Isso é possível?

CodeGuy
fonte

Respostas:

139

Você pode obter o caminho para o Resourcesdiretório assim,

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

Em seguida, anexe o Documentsao caminho,

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

Em seguida, você pode usar qualquer uma das APIs de listagem de diretório de NSFileManager.

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

Observação : ao adicionar a pasta de origem ao pacote, certifique-se de selecionar "Criar referências de pasta para qualquer opção de pastas adicionadas ao copiar"

Deepak Danduprolu
fonte
2
interessante. sem o acréscimo funcionou e encontrou tudo (incluindo a pasta Documentos). mas com esse acréscimo, a matriz "directoryOfContents" é nula
CodeGuy
espere, "Documentos" é um "Grupo", não uma pasta. hm. como faço para adicionar uma pasta na minha pasta de recursos?
CodeGuy
Você pode adicionar Drag & Dropuma pasta ao projeto e o conteúdo será copiado. Ou Adicione uma Copy Filesfase de construção e especifique o diretório a ser copiado.
Deepak Danduprolu
ok, arrastei-o. mas ele ainda acha que o diretório está vazio. hm.
CodeGuy
4
Você selecionou a Create folder references for any added foldersopção ao copiar?
Deepak Danduprolu
28

Rápido

Atualizado para Swift 3

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

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

Leitura adicional:

Suragch
fonte
4
Error Domain = NSCocoaErrorDomain Code = 260 "A pasta“ Recursos ”não existe." UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Pasta), NSUnderlyingError = 0x1c4450orDIX Domínio = 0x1c4450orDIX "Código de erro = 0x1c4450140" NOME do erro 2 arquivo ou diretório "}}
Argus
18

Você também pode tentar este código:

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

NSLog(@"directoryContents ====== %@",directoryContents);
Neowinston
fonte
você está alocando uma matriz em directoryContents que é imediatamente substituída por uma matriz retorna por contentsOfDir ...
Joris Weimar
O que eu quis mostrar foi apenas uma matriz que conteria o conteúdo do diretório. A matriz está lá apenas por exemplo. Eu editei um pouco.
neowinston
15

Versão Swift:

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

Listando todos os arquivos em um diretório

     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
     }

Enumeração recursiva de arquivos em um diretório

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

Para mais informações sobre o NSFileManager, está aqui

Govind
fonte
3
Não funcionará se a extensão tiver o '.'. Em outras palavras, isso funcionará: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
Liangjun
4

Swift 3 (e URLs de retorno)

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

Swift 4:

Se você tem a ver com subdiretórios "Relativo ao projeto" (pastas azuis), você pode escrever:

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

Uso :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}
Alessandro Ornano
fonte
Exatamente o que eu estava procurando. Obrigado !!
Rogerstone