【问题标题】:Removing structure of empty folders删除空文件夹的结构
【发布时间】:2021-12-06 20:17:14
【问题描述】:

我正在尝试删除目录中的所有空文件夹(有时是文件夹中的文件夹)。

我正在尝试这样做(见下文),但它仍然保留最后一个文件夹。

如果有更好的方法来解决这个问题?


func removeEmptyFoldersAt(url: URL) {
    let folderContents = try? fm.contentsOfDirectory(at: url, includingPropertiesForKeys: [.isDirectoryKey], options: [.skipsPackageDescendants, .skipsHiddenFiles]).filter({u in
        let attr = try? u.resourceValues(forKeys: [.isDirectoryKey])
        return attr!.isDirectory!
    })
    for folder in folderContents! {
        let attr = try? folder.resourceValues(forKeys: [.isDirectoryKey])
        let contents = try? fm.contentsOfDirectory(at: folder, includingPropertiesForKeys: [], options: [.skipsHiddenFiles,.skipsPackageDescendants])
        if attr!.isDirectory! && contents!.count > 0 {
            removeEmptyFoldersAt(url: folder)
        }
        if attr!.isDirectory! && contents?.count == 0 {
            try? fm.removeItem(at: folder)
        }
    }
}

【问题讨论】:

  • 听起来像是一个家庭作业问题。您应该使用深度优先搜索并删除遇到的任何空文件夹:github.com/raywenderlich/swift-algorithm-club/tree/master/…
  • try? 的这种用法实在是不妥。处理您的错误。
  • @Alexander,点了。你是绝对正确的,当然。 (我通常会捕获 {} 一切......我只是把它拿出来测试递归)。

标签: swift macos recursion


【解决方案1】:

我会遵循稍微不同的工作流程,我会让 removeEmptyFoldersAt 在其工作流程中更加通用。

所以你可以通过URL 如果:

  • 它是一个目录,列出内容并用每个项目递归调用自己
  • 这是一个文件,只需删除它

例如...

extension URL {
    var isDirectory: Bool {
       return (try? resourceValues(forKeys: [.isDirectoryKey]))?.isDirectory ?? false
    }
}

func removeItem(at url: URL) throws {
    let fm = FileManager.default
    if url.isDirectory {
        for item in try fm.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: []) {
            try removeItem(at: item)
        }
    }
    try fm.removeItem(at: url)
}

nb:我没有对此进行测试,但这是我过去使用过的常见工作流程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2010-09-23
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多