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
相关产品推荐
相关产品推荐

