遍历已安装的卷以查找特定的文件类型
Posted
技术标签:
【中文标题】遍历已安装的卷以查找特定的文件类型【英文标题】:Traversing mounted volumes to find specific file types 【发布时间】:2017-11-29 14:28:00 【问题描述】:我试图弄清楚如何扫描已安装的卷(它们连接到服务器并通过 afp:// 安装到我的工作站上)并选择某些文件类型,并输出路径、文件名和资产id 到 csv 文件。资产ID是文件名的最后10位,前面有一个“_”(例如:afilename_1234567890.mov)有些文件没有资产ID(我忽略)有些文件有多个“.”(例如,afilename_videofile_23.98_prores_1234567890.mov)。我可以获得所需的卷(更少的时间机器备份驱动器),但尝试扫描文件很麻烦。我查看了各种示例并研究了 Apple FileManager 文档,但没有任何具体内容。
我有以下例程来做我需要的事情,但使用 let enumerator = fileManager.enumerator(atPath: url.path)!,枚举器始终为空。
要么我做了一个错误的假设,要么我肯定错过了一些关键的东西。
func FindFilesWithAssetIDs()
// Find all the mounted volumes
let keys: [URLResourceKey] = []
let volumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: keys, options: [])!
var count = 0
var volumeCount = volumes.count
var volumeItem = 0
let filterExtensions = ["mxf", "mov", "mp4", "scc", "cap", "srt", "txt", "rtf", "wav", "mp3", "m2v", "aif"]
// Scan all the mounted volumes, one at a time
for url in volumes
let components = url.pathComponents
if components.count > 1 && components[1] == "Volumes"
if components[2] == "Time Machine Backup" continue // Check if the volume is the staff backup disk. If it is, move on to the next volume
guard let volumeTypeKey = try? url.resourceValues(forKeys: [.volumeIsLocalKey]) else return // Make sure we are scanning the volumes and not any local folders like /private
let volumeType: Bool = volumeTypeKey.volumeIsLocal!
if volumeType == false
let fileManager = FileManager.default
let enumerator = fileManager.enumerator(atPath: url.path)!
while let element = enumerator.nextObject() as? String
if element.hasSuffix("mxf") || element.hasSuffix("mov") // a test. I would much rather use a filterExtension method or a switch statement
// do something
count += 1
NSLog(url.path, " ", String(count))
// NSLog(url.path)
volumeItem += 1
任何帮助将不胜感激。
【问题讨论】:
呃!!我建议使用 NSMetadataQuery aka Spotlight,而不是使用 nsfilemanager 枚举。介绍见这里:https://developer.apple.com/library/content/documentation/Carbon/Conceptual/SpotlightQuery/Concepts/QueryingMetadata.html#//apple_ref/doc/uid/TP40001848-CJBEJBHH
【讨论】:
【参考方案2】:我尝试使用 Applescript 扫描卷,但有一些文件,即使它们存在,Spotlight 也找不到它们。我在所有已安装的卷上重建了 Spotlight 数据库,但没有运气。由于这些错误,我求助于 Swift。
归根结底,我使用 Swift 比 Applescript 领先得多。我对代码做了一些更改(while let element = enumerator.nextObject() as?String 现在是 while let element = enumerator.nextObject() as?URL ) 缩短字符串 URL 调用等的其他例程。
我正在结束这个问题,因为它已经解决了。
【讨论】:
以上是关于遍历已安装的卷以查找特定的文件类型的主要内容,如果未能解决你的问题,请参考以下文章