Список сохраненных файлов в каталоге документов iOS в UitableView?
-
28-10-2019 - |
Вопрос
Я настроил следующий код для сохранения файла в каталог документов:
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 перемещался в этот файл (все в автономном режиме).
Кроме того - как я могу просто получить имя файла и заканчиваться, например, «logo.png» вместо http://www.reddexuk.com/logo.png?
Как я могу это сделать?
Решение
Вот метод, который я использую для получения содержания каталога.
-(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)
}
}
Я знаю, что это старый вопрос, но он хороший, и все изменилось в пост -песочнице iOS.
Путь ко всем читаемым/приписываемым папкам в приложении будут Теперь есть хэш, и 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;
}
Для более разумного имени файла:
NSString *filename = [[url lastPathComponent] stringByAppendingPathExtension:[url pathExtension]];
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)
}
Swift 5
Функция, которая возвращает массив URL -адресов всех файлов в каталоге документов, которые являются видео MP4. Если вы хотите все файлы, просто удалите filter
.
Он проверяет только файлы в верхнем каталоге. Если вы хотите перечислить, также файлы в подкатализаторах, удалите .skipsSubdirectoryDescendants
вариант.
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 ?? []
}