58

我设置了以下代码以将文件保存到文档目录:

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

我怎样才能做到这一点?

4

9 回答 9

145

这是我用来获取目录内容的方法。

-(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;
}
于 2011-12-04T16:08:27.810 回答
21
-(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; }

上面的例子是不言自明的。我希望它能回答你第二个问题。

于 2011-12-04T16:30:38.500 回答
11

获取目录的内容

- (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]
于 2011-12-04T16:10:46.340 回答
8

谢谢亚历克斯,

这是斯威夫特版本

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentDirectory = paths[0]
if let allItems = try? FileManager.default.contentsOfDirectory(atPath: documentDirectory) {
    print(allItems)
}
于 2015-04-19T07:15:27.443 回答
6

我知道这是一个老问题,但这是一个很好的问题,并且在 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;
}
于 2015-04-16T18:07:54.373 回答
4

对于更合理的文件名:

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

于 2011-12-06T04:50:13.403 回答
3

斯威夫特 5

返回 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 ?? []
}
于 2019-04-19T21:54:12.713 回答
2
NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir_path];

NSString *filename;

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

用于枚举目录中的所有文件

于 2015-09-13T16:12:35.397 回答
1

斯威夫特 3.x

let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
if let allItems = try? FileManager.default.contentsOfDirectory(atPath: documentDirectory) {
  print(allItems)
}
于 2017-07-31T14:12:13.700 回答