web-dev-qa-db-fra.com

Liste des fichiers enregistrés dans le répertoire des documents iOS dans UITableView?

J'ai configuré le code suivant pour enregistrer un fichier dans le répertoire des documents:

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

Cependant, je souhaite ajouter chaque fichier à un UITableView lorsqu'il est enregistré avec succès. Lorsque le fichier dans UITableView est tapé, j'aimerais qu'un UIWebView navigue vers ce fichier (tous hors ligne).

Aussi - comment puis-je simplement obtenir le nom de fichier et la fin tels que "logo.png" au lieu de http://www.reddexuk.com/logo.png ?

Comment puis-je faire ceci?

55
pixelbitlabs

Voici la méthode que j'utilise pour obtenir le contenu d'un répertoire.

-(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;
}
143
syclonefx
-(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'exemple ci-dessus est assez explicite. J'espère que cela répond à votre deuxième question.

21
Mike Martin

Pour obtenir le contenu d'un répertoire

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

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

Pour obtenir le dernier composant de chemin,

[[path pathComponents] lastObject]
11
coneybeare

Merci Alex,

Voici Swift version

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

Je sais que c'est une vieille question, mais c'est une bonne question et les choses ont changé dans iOS après le Sandboxing.

Le chemin d'accès à tous les dossiers lisibles/inscriptibles dans l'application sera contient maintenant un hachage et Apple se réserve le droit de modifier ce chemin à tout moment. Il - va changer à chaque lancement d'application pour sûr.

Vous devrez obtenir le chemin d'accès au dossier que vous voulez et vous ne pouvez pas le coder en dur comme nous le faisions auparavant.

Vous demandez le répertoire des documents et dans le tableau de retour, il est à la position 0. Ensuite, à partir de là, vous utilisez cette valeur pour fournir au NSFileManager pour obtenir le contenu du répertoire.

Le code ci-dessous fonctionne sous iOS 7 et 8 pour renvoyer un tableau du contenu dans le répertoire des documents. Vous voudrez peut-être le trier selon vos propres préférences.

+ (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;
}
5
Alex Zavatone

Pour un nom de fichier plus raisonnable:

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

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

NSString *filename;

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

pour énumérer tous les fichiers du répertoire

2
FertoVordalastr

Swift 3.x

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

Swift 5

Fonction qui renvoie un tableau d'URL de tous les fichiers du répertoire Documents qui sont des vidéos MP4. Si vous voulez tous les fichiers, supprimez simplement le filter.

Il vérifie uniquement les fichiers du répertoire supérieur. Si vous souhaitez répertorier également les fichiers dans les sous-répertoires, supprimez le .skipsSubdirectoryDescendants option.

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 ?? []
}
0
Marián Černý