You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift提取本地服务器文件元数据失败,求解决方法(附代码)

无法获取本地服务器文件元数据的问题

我在获取本地服务器上文件的元数据时遇到了问题。

我的处理流程如下:

  • checkAction函数通过directoryContentsDiskStation函数成功获取所选目录的文件列表
  • 遍历文件列表,为每个文件调用getFileMetadata函数提取所需元数据

但遇到的异常情况:

  • 针对本地服务器上的文件调用getFileMetadata时,无法返回任何属性
  • 针对Mac本地存储的文件调用该函数时,能正常返回属性

我还尝试过以下方案,均未解决问题:

  • 使用AVAsset和MDItem等其他方式获取元数据,结果类似
  • 将服务器名称加入URL(如http://DiskStation/)

盼求解决方法。

//directoryArray contains selected Directory
@objc func checkAction(_ sender: NSButton) {
    //get file list in selected directory
    let fileList = directoryContentsDiskStation(dirName: "/Volumes/Volume/ServerFiles/"+ directoryArray[sender.tag])
    if fileList.count > 0 {
        for j in 0...fileList.count-1 {
            //get metadata for each file in the selected directory
            let fileName = "/Volumes/Volume/ServerFiles/"+ directoryArray[sender.tag]+"/"+fileList[j]
            let codecVals = supportFunctions.getFileMetadata(fileName: fileName)
        }
    }
}

//returns array containing list of files in selected directory
func directoryContentsDiskStation(dirName: String) -> [String] {
    var pfadList = [String]()
    let fileManager = FileManager.default
    let docDir = dirName
    //get list of files in selected directory
    let directoryContents = try? fileManager.contentsOfDirectory(atPath: docDir)
    if directoryContents != nil {
        if directoryContents!.count > 0 {
            for i in 0...directoryContents!.count-1 {
                if FileManager.default.fileExists(atPath: docDir+"/"+directoryContents![i]) {
                    //if file exists
                    pfadList.append(directoryContents![i])
                }
            }
        }
    }
    return pfadList
}

//retrieves metadata for selected dataset
//returns array containing metadata
class func getFileMetadata(fileName: String) -> [String] {
    let path = URL(fileURLWithPath: fileName)
    let item = NSMetadataItem(url: path)
    var keyValuePairs = [(key: String, value: Any)]()
    //get the attributes for selected file
    //FILES ON SERVER RETURNS NO ATTRIBUTE VALUES
    //FILES ON LOCAL MAC DO RETURN ATTRIBUTE VALUES
    if let attributes = item!.values(forAttributes: item!.attributes) {
        //loop through file attributes and append to key value array
        for attItem in attributes {
            keyValuePairs.append(attItem)
        }
    }
    //loop through attribute items selecting required metadata values
    var returnVals = ["kMDItemPixelWidth ", "kMDItemPixelHeight ", "kMDItemCodecs ", "kMDItemCodecs " , "kMDItemContentCreationDate ", "kMDItemVideoBitRate "]
    for metaValue in keyValuePairs {
        if metaValue.key == "kMDItemPixelWidth" {
            returnVals[0] = returnVals[0] + String(describing: metaValue.value as! NSNumber)
        }
        if metaValue.key == "kMDItemPixelHeight" {
            returnVals[1] = returnVals[1] + String(describing: metaValue.value as! NSNumber)
        }
        if metaValue.key == "kMDItemCodecs" {
            let codecs = metaValue.value as! NSArray
            for i in 0...codecs.count-1 {
                if i > 1 {
                    break
                }
                returnVals[i+2] = returnVals[i+2] + (codecs[i] as! String)
            }
        }
        if metaValue.key == "kMDItemContentCreationDate" {
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            returnVals[4] = returnVals[4] + formatter.string(from:((metaValue.value as! NSDate) as Date))
        }
        if metaValue.key == "kMDItemVideoBitRate" {
            returnVals[5] = returnVals[5] + String(describing: metaValue.value as! NSNumber)
        }
    }
    return returnVals
}

内容的提问来源于stack exchange,提问作者user12719663

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:43:15