2011-12-04 14 views
53

Ho installato il seguente codice di salvare un file nella directory di documenti:Elenca i file salvati nella directory dei documenti iOS in un UITableView?

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

Tuttavia, desidero aggiungere ogni file a un UITableView quando viene salvato. Toccando il file di UITableView, vorrei che UIWebView navighi su quel file (tutto offline).

Inoltre, come posso ottenere il nome file e terminare come "logo.png" invece di http://www.reddexuk.com/logo.png?

Come posso fare questo?

risposta

138

Ecco il metodo che utilizzo per ottenere il contenuto di una directory.

-(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; 
} 
+0

grazie, ma come si inseriscono questi dati in un UITableView e quindi si apre il file in UIWebView? – pixelbitlabs

+1

Ecco un buon tutorial [UITableView] (http://www.iosdevnotes.com/2011/10/uitableview-tutorial/) ed ecco il link al [progetto xcode] (https://github.com/cwalcott/UITableView-Tutorial) per questo tutorial. Ecco un buon tutorial su [UIWebView] (http://www.iphonesdkarticles.com/2008/08/uiwebview-tutorial.html) – syclonefx

+0

Grazie per quello. So come creare un UITableView ecc. Ma non sono sicuro di come ottenere i file direttamente in UITableView. Il sito che hai inviato non menziona neanche questo :( – pixelbitlabs

11

per ottenere il contenuto di una directory

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

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

Per ottenere l'ultimo componente del percorso,

[[path pathComponents] lastObject] 
+0

grazie, ma come inserisco questi dati in un UITableView e poi apro il file in UIWebView? Inoltre, "[[path pathComponents] lastObject]" non otterrebbe il nome completo del file solo il tipo di file (ad esempio ".gif" non "test.gif"), quindi cosa posso fare per ottenere "test.gif"? – pixelbitlabs

+2

Suggerisco di leggere su UITableViews. Un tutorial di lunghezza completa non avverrà mai su Stack Overflow – coneybeare

+0

ma @coneybeare - non hai menzionato nulla in risposta al commento sui tipi di file. Anch'io sono desideroso di farlo. Puoi indicarmi la direzione giusta per favore? – pixelbitlabs

19
-(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; } 

L'esempio sopra è abbastanza auto-esplicativo. Spero che risponda alla seconda domanda.

+0

Grazie, ma non è quello che stavo davvero chiedendo. Non voglio trovare più nomi di file, voglio solo tagliare http://www.domain.com/, quindi alla fine rimango con il bit "file.suffix". Sicuramente c'è un modo più veloce per farlo? – pixelbitlabs

+0

@ Martin Martin la tua risposta mi ha dato un'idea per risolvere un problema che sto affrontando in questo momento. Grazie. P.S. Ancora una cosa, cosa succede se ho bisogno di aggiungere file "match" (oggetti) che potrebbero avere un'estensione dal seguente set: @ "txt", @ "pdf", @ "doc", @ "rtf", @ "png", @ "jpeg"? – eugen

4

Per un nome di file più ragionevole:

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

4

So che questa è una vecchia questione, ma è una buona e le cose sono cambiate in iOS posta Sandboxing.

Il percorso di tutte le cartelle leggibili/scrivibili all'interno dell'app sarà ora ha un hash in esso e Apple si riserva il diritto di modificare tale percorso in qualsiasi momento. Lo corrisponderà al cambiamento in ogni avvio dell'app.

Avrete bisogno di ottenere il percorso per la cartella che si desidera e non è possibile codificare in modo rigido come eravamo abituati a fare in passato.

Chiede la directory dei documenti e nell'array di restituzione, è in posizione 0. Quindi da lì, si utilizza quel valore per fornire a NSFileManager il contenuto della directory.

Il codice seguente funziona con iOS 7 e 8 per restituire un array del contenuto all'interno della directory dei documenti. Potresti voler ordinarlo in base alle tue preferenze.

+ (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; 
} 
8

Grazie Alex,

Ecco Swift versione

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) 
    } 
} 
1
NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir_path]; 

NSString *filename; 

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

per enumerare attraverso tutti i file nella directory

1

Swift 3.x

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

come ottenere l'elenco dei file da "Documenti/Posta in arrivo"? e selezionare uno qualsiasi. –

Problemi correlati