Список сохраненных файлов в каталоге документов iOS в 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];

тем не менее, я хочу добавить каждый файл в UITableView, когда он будет успешно сохранен. Когда файл в UITableView прослушивается, я бы хотел, чтобы UIWebView перешел к этому файлу (все в автономном режиме).

также - как я могу просто получить имя файла и заканчивая такими, как "логотип.png " вместо http://www.reddexuk.com/logo.png?

Как я могу это сделать?

8   53  

8 ответов:

вот метод, который я использую, чтобы получить содержимое каталога.

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

приведенный выше пример говорит сам за себя. Я надеюсь, что это ответит вам на второй вопрос.

чтобы получить содержимое каталога

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

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

чтобы получить последний компонент пути,

[[path pathComponents] lastObject]

Спасибо Алекс,

вот 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)
    }
}

для более разумного именем:

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

Я знаю, что это старый вопрос, но он хороший, и все изменилось в iOS post Sandboxing.

путь ко всем читаемым / записываемым папкам в приложении будет теперь есть хэш в нем, и Apple оставляет за собой право изменить этот путь в любое время. Это будет изменение при каждом запуске приложения наверняка.

вам нужно будет получить путь к нужной папке, и вы не можете жестко закодировать его, как мы привыкли делать в прошлом.

вы просите каталог документов и в возвращаемом массиве он находится в позиции 0. Затем оттуда вы используете это значение для предоставления в NSFileManager для получения содержимого каталога.

приведенный ниже код работает под iOS 7 и 8, чтобы вернуть массив содержимого в каталоге документов. Вы можете отсортировать его в соответствии с вашими собственными предпочтениями.

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

NSString *filename;

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

для перечисления всех файлов в каталоге

Swift 3.x

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