列出(仅)文件夹中的子文件夹——Swift 3.0 / iOS 10 [重复]

Posted

技术标签:

【中文标题】列出(仅)文件夹中的子文件夹——Swift 3.0 / iOS 10 [重复]【英文标题】:Listing (only) the subfolders within a folder -- Swift 3.0 / iOS 10 [duplicate] 【发布时间】:2017-03-20 01:20:21 【问题描述】:

我正在尝试获取文件夹中所有子文件夹的列表(应用程序的 Documents 目录,在下面的示例中)。下面的代码成功地找到了文件夹中的所有内容(文件 + 文件夹两者),并且还找到了具有指定 .text 扩展名的文件,但我未能将结果缩小到只是的列表子目录。

let filemgr = FileManager.default
var dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
myDocumentsDirectory = dirPaths[0]

var r = "Directory Listing:\n------------------\n" // r = will be returned (or displayed in this case)

do 
    let directoryContents = try FileManager.default.contentsOfDirectory(at: myDocumentsDirectory, includingPropertiesForKeys: nil, options: [])

    // all files -- works fine
    let allFileNames = directoryContents.map $0.deletingPathExtension().lastPathComponent 
    r += "All file names:\n\(allFileNames)\n\n"

    // filtering for text files -- also works fine
    let textFiles = directoryContents.filter $0.pathExtension == "text" 
    let textFileNames = textFiles.map $0.deletingPathExtension().lastPathComponent 
    r += "text file list:\n\(textFileNames)\n\n"

    // Look for folders within the folder -- fails, nothing returned            
    let subdirs = directoryContents.filter !$0.isFileURL 
    let subdirNames = subdirs.map $0.deletingPathExtension().lastPathComponent 

    r += "Subdirectories:\n\(subdirNames)\n\n"
    textView.text = r

 catch let error as NSError 
    print(error.localizedDescription)

我可以通过将过滤器设置为来获取所有目录

$0.pathExtension == ""

但是 拾取目录中没有扩展名的任何文件 - 即它正确排除 foo.bar 但错误地包含文件 foo 以及文件夹,这不是我需要的 - 必须是目录,仅此而已。

另外,我并不想深入研究子文件夹中的子文件夹——我只在寻找“这里”的那些。

任何建议将不胜感激!

【问题讨论】:

多么糟糕的 API。为什么我们必须编写一堆额外丑陋的代码来做一些基本的事情,比如过滤掉目录或过滤掉文件? 【参考方案1】:

您可以在第 6 行的 contentsOfDirectory 方法调用中将 URLResourceKey.isDirectoryKey 传递给 includingPropertiesForKeys 参数。这应该为您返回的所有 URL 返回该特定属性。然后,您可以检查该属性以查看每个 URL 是用于目录还是文件...

如果您想知道如何获取获取的 URL 的属性,请查看 resourceValues 类的 resourceValues 方法:)

【讨论】:

【参考方案2】:

Fahim 的回答,特别是 URL 类的 resourceValues 方法,正是我所需要的;为了完整性和帮助以后发现这个问题的任何人,这里是最终代码,它得到了我想要的,同时保持相同的基本结构:

let filemgr = FileManager.default
var dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
myDocumentsDirectory = dirPaths[0]

do 
    let directoryContents = try FileManager.default.contentsOfDirectory(at: myDocumentsDirectory, includingPropertiesForKeys: nil, options: [])

    let onlyFileNames = directoryContents.filter !$0.hasDirectoryPath 
    let onlyFileNamesStr = onlyFileNames.map  $0.lastPathComponent 

    let subdirs = directoryContents.filter $0.hasDirectoryPath 
    let subdirNamesStr = subdirs.map $0.lastPathComponent 

    // now do whatever with the onlyFileNamesStr & subdirNamesStr
 catch let error as NSError 
    print(error.localizedDescription) 

【讨论】:

以上是关于列出(仅)文件夹中的子文件夹——Swift 3.0 / iOS 10 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用Java 8流仅列出特定深度的文件夹

Core 3.0 中的 Process.Start 不会仅按名称打开文件夹

列出设备iOS swift中的所有音频文件

PHP 仅列出PHP文件夹中的某些文件

PHP Wordpress:仅列出特定父页面的子页面

AWS S3策略限制用户仅列出存储桶中的某些文件夹