枚举期间获取完整文件路径

时间:2017-09-16 10:44:07

标签: swift xcode macos

我正在使用以下代码枚举用户选择的路径,并使用具有特定扩展名的文件名填充数组。

let enumerator:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path)!

    while let element = enumerator.nextObject() as? String {
    if ((element.hasSuffix("jpg"))||element.hasSuffix("playground")) {
    if(!self.yourArray.contains(element))
    {
    self.yourArray.append(element)
    }
    }

我需要获取完整的文件路径才能将文件添加到处理队列中。

此外,我如何阻止枚举器探索子目录。

请指教。

2 个答案:

答案 0 :(得分:1)

首先使用与URL相关的API,它更通用。

DirectoryEnumerator contentsOfDirectory不同,返回目录中没有子目录的所有项目的URL。

一个简单的解决方案是一系列路径扩展和filter函数

let url = URL(fileURLWithPath: "/Users/myUser/Pictures/")
let filterExtensions = ["jpg", "playground"]
do {
    self.yourArray = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil)
        .filter{ filterExtensions.contains($0.pathExtension) }
    print(yourArray)
} catch {
    print(error)
}

请注意yourArray将包含网址,而不是字符串路径。

答案 1 :(得分:0)

使用目录枚举器:

这将允许您获取所有子目录中的所有文件,而不仅仅是一级。将您提供给 fileManager.enumerator(atPath: path)! 的路径转换为如下所示的 URL,然后将目录枚举器提供的路径附加到此 URL:

let directoryUrl = URL(fileURLWithPath: path)
let pathUrl = directoryUrl.appendingPathComponent(element)

如果我在写你的代码,我也会做一些重命名/改进:

func main() {
    // Set up your variables
    let fileManager = FileManager.default
    let path = "/Users/username"
    var files = [URL]() // Using a URL instead of a path.

    let enumerator: FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path)!
    let directoryUrl = URL(fileURLWithPath: path)

    while let filepath = enumerator.nextObject() as? String {
        if ((filepath.hasSuffix(".jpg")) || filepath.hasSuffix(".playground")) {
            let pathUrl = directoryUrl.appendingPathComponent(filepath)
            files.append(pathUrl)
        }
    }
}