遍历已安装的卷以查找特定的文件类型

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
    

任何帮助将不胜感激。

【问题讨论】:

呃!! ...“App Sandbox”开关由于某种原因被打开,这阻止了我的代码访问网络卷。所以,给定“元素”变量,我如何过滤掉以“。”开头的文件。 (不可见文件),有没有更好的方法来使用“filterExtensions”变量过滤文件?谢谢 接受您之前问题的答案将极大地鼓励我提供更详细的答案:-) 【参考方案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 调用等的其他例程。

我正在结束这个问题,因为它已经解决了。

【讨论】:

以上是关于遍历已安装的卷以查找特定的文件类型的主要内容,如果未能解决你的问题,请参考以下文章

python 遍历文件夹下的特定类型文件

linux查找当前目录下所有子目录特定文件类型需要查找的文件内容

GlusterFS分布式文件系统的卷类型及配置详解

grep 递归查找 Linux 上的特定文件类型

打开 ZipFile,查找特定文件类型并保存文件名

查找用于在 Windows 上打开特定文件类型的默认应用程序