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?

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"


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:


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);

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)
        }
    }

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


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)
    }

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..
}

Exatamente o que eu estava procurando. Obrigado !!
Rogerstone
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.