如何在iPhone SDK中列出所有文件夹及其子目录/文件?

11

我希望用户能够选择其iPhone中存在的任何文件,以便将其作为电子邮件附件使用。为此,我想展示iPhone中所有文件和文件夹的列表。但是如何获取这些文件的列表?是否有获取该列表的方法?


但是例如,我在iPhone的硬盘上有一个.pdf文件,我想定位该文件或获取该文件的路径,那么...??? - Muhammad Saqib
你不能直接访问应用程序沙盒以外的文件。但是,你可以告诉系统你的应用程序支持 PDF 格式,并允许其他应用程序将 PDF 文件发送到你的应用程序中。这是唯一的方法。 - rckoenes
5个回答

18

请注意,您的应用程序运行在沙盒中,不能获取沙盒之外的任何文件夹/文件。

ObjectiveC

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *manager = [NSFileManager defaultManager];
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil];
for (NSString *s in fileList){
    NSLog(@"%@", s);
}

Swift 4

->

Swift 4

guard let documentsDirectory =  try? FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) else { return }
guard let fileEnumerator = FileManager.default.enumerator(at: documentsDirectory, includingPropertiesForKeys: nil, options: FileManager.DirectoryEnumerationOptions()) else { return }
while let file = fileEnumerator.nextObject() {
    print(file)
}

5
这是最慢的方法(?):
NSFileManager * fileManager = [NSFileManager new];
NSArray * subpaths = [fileManager subpathsAtPath:path];

但至少这应该能指向你需要的更专业的实现。

稍微低一级的抽象层,允许您按需枚举的包括NSDirectoryEnumeratorCFURLEnumerator。根据目录的深度,与-[NSFileManager subpathsAtPath:]相比,它们有潜力节省大量不必要的文件系统交互。


请问您能否在第二行中提及变量"path"的值。 - Muhammad Saqib
@Muhammed 嗯,你无法访问文件系统中的任何文件,因为它是沙箱化的。 但是你确实可以访问你应用的本地数据- simpleBob的 documentsDirectory演示了如何获取该路径。 - justin
谢谢您的回复,我有一个小疑问。如果我的文件存在于iPhone的照片文件夹中,我该如何访问它呢?我的意思是,我能列出所有存在于照片文件夹中的文件吗? - Muhammad Saqib
1
@Muhammed Saqib,不用谢。对于那些共享的图像,您可以使用AssetsLibrary.framework。 - justin

3
你可以通过NSFileManager.enumeratorAtPath使用NSDirectoryEnumerator

来自文档:

NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:  @"Documents"];
NSFileManager *localFileManager=[[NSFileManager alloc] init];
NSDirectoryEnumerator *dirEnum =
    [localFileManager enumeratorAtPath:docsDir];

NSString *file;
while ((file = [dirEnum nextObject])) {
    if ([[file pathExtension] isEqualToString: @"doc"]) {
        // process the document
        [self scanDocument: [docsDir stringByAppendingPathComponent:file]];
    }
}

2

swift 3

    let fileManager:FileManager = FileManager()
    let files = fileManager.enumerator(atPath: NSHomeDirectory())
    while let file = files?.nextObject() {
        print("Files::",file)
    }

1
我是FileExplorer控件的作者,它是iOS的文件浏览器,并满足您的大部分需求。请注意,它只允许您浏览放置在沙盒内的文件和目录。
以下是我的控件的一些特点:
  1. 如果需要,可以选择文件或/和目录
  2. 如果需要,可以删除文件或/和目录
  3. 内置搜索功能
  4. 查看音频、视频、图像和PDF文件。
  5. 可以添加对任何文件类型的支持。
您可以在这里找到我的控件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接