Pregunta

He configurado el siguiente código para guardar un archivo en el directorio de documentos:

NSLog(@"Saving File...");

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.reddexuk.com/logo.png"]];
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"logo.png"];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Successfully downloaded file to %@", path);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

[operation start];

Sin embargo, deseo agregar cada archivo a UITATYVIEW cuando se guarde con éxito. Cuando se aprovecha el archivo en UITableView, me gustaría que un UiWebView navegue a ese archivo (todo fuera de línea).

Además, ¿cómo puedo obtener el nombre de archivo y el final como "logo.png" en lugar de http://www.reddexuk.com/logo.png?

¿Cómo puedo hacer esto?

¿Fue útil?

Solución

Aquí está el método que utilizo para obtener el contenido de un directorio.

-(NSArray *)listFileAtPath:(NSString *)path
{
    //-----> LIST ALL FILES <-----//
    NSLog(@"LISTING ALL FILES FOUND");

    int count;

    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL];
    for (count = 0; count < (int)[directoryContent count]; count++)
    {
        NSLog(@"File %d: %@", (count + 1), [directoryContent objectAtIndex:count]);
    }
    return directoryContent;
}

Otros consejos

-(NSArray *)findFiles:(NSString *)extension{

NSMutableArray *matches = [[NSMutableArray alloc]init];
NSFileManager *fManager = [NSFileManager defaultManager];
NSString *item;
NSArray *contents = [fManager contentsOfDirectoryAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] error:nil];

// >>> this section here adds all files with the chosen extension to an array
for (item in contents){
    if ([[item pathExtension] isEqualToString:extension]) {
        [matches addObject:item];
    }
}
return matches; }

El ejemplo anterior se explica por sí mismo. Espero que te responda la segunda pregunta.

Para obtener el contenido de un directorio

- (NSArray *)ls {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory];

    NSLog(@"%@", documentsDirectory);
    return directoryContent;
}

Para obtener el último componente de ruta,

[[path pathComponents] lastObject]

Gracias Alex,

Aquí está la versión Swift

func listFilesOnDevice() {

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentDirectory = paths[0] as! String
    let manager = NSFileManager.defaultManager()
    if let allItems = manager.contentsOfDirectoryAtPath(documentDirectory, error: nil) {
        println(allItems)
    }
}

Sé que esta es una pregunta antigua, pero es buena y las cosas han cambiado en iOS después del sandboxing.

El camino a todas las carpetas legibles/escritables dentro de la aplicación voluntad Ahora tenga un hash y Apple se reserva el derecho de cambiar ese camino en cualquier momento. Eso voluntad Cambie en cada lanzamiento de la aplicación seguro.

Deberá obtener el camino a la carpeta que desea y no puede codificarlo como solíamos hacer en el pasado.

Pide el directorio de documentos y en la matriz de devolución, está en la posición 0. Luego, desde allí, usa ese valor para suministrar al NSFilemanager para obtener el contenido del directorio.

El siguiente código funciona en iOS 7 y 8 para devolver una matriz de los contenidos dentro del directorio de documentos. Es posible que desee ordenarlo de acuerdo con sus propias preferencias.

+ (NSArray *)dumpDocumentsDirectoryContents {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];

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

    NSLog(@"%@", directoryContents);
    return directoryContents;
}

Para un nombre de archivo más razonable:

NSString *filename = [[url lastPathComponent] stringByAppendingPathExtension:[url pathExtension]];

NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir_path];

NSString *filename;

while ((filename = [dirEnum nextObject]))
{
    // Do something amazing
}

para enumerar a través de todos los archivos en el directorio

Swift 3.x

let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
if let allItems = try? FileManager.default.contentsOfDirectory(atPath: documentDirectory) {
  print(allItems)
}

Swift 5

Función que devuelve la matriz de URL de todos los archivos en el directorio de documentos que son videos MP4. Si desea todos los archivos, simplemente elimine el filter.

Comprueba solo archivos en el directorio superior. Si desea enumerar también archivos en los subdirectorios, elimine el .skipsSubdirectoryDescendants opción.

func listVideos() -> [URL] {
    let fileManager = FileManager.default
    let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]

    let files = try? fileManager.contentsOfDirectory(
        at: documentDirectory,
        includingPropertiesForKeys: nil,
        options: [.skipsSubdirectoryDescendants, .skipsHiddenFiles]
    ).filter {
        $0.lastPathComponent.hasSuffix(".mp4")
    }

    return files ?? []
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top