[英]How can I load my UITableView with a list of saved files in my documents directory?
[英]List saved files in iOS documents directory in a 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 导航到该文件(全部脱机)。
另外 - 我怎样才能获得文件名和结尾,例如“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 版本
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentDirectory = paths[0]
if let allItems = try? FileManager.default.contentsOfDirectory(atPath: documentDirectory) {
print(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
}
用于枚举目录中的所有文件
返回 Documents 目录中所有 MP4/M4V 视频文件的 URL 数组的函数。 如果您想要所有文件,只需删除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 {
["mp4", "m4v"].contains($0.pathExtension.lowercased())
}
return files ?? []
}
斯威夫特 3.x
let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
if let allItems = try? FileManager.default.contentsOfDirectory(atPath: documentDirectory) {
print(allItems)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.