FileManager
のcopyItem(at:path:)
を使用して、いくつかの(メディア)ファイルをあるフォルダーから別のフォルダーにコピーしようとしていますが、エラーが発生します。
CFURLCopyResourcePropertyForKeyは、スキームのないURLが渡されたため失敗しました。エラードメイン= NSCocoaErrorDomainコード= 262「指定されたURLタイプがサポートされていないため、ファイルを開くことができませんでした。」
Xcode9ベータ版とSwift 4)を使用しています。
let fileManager = FileManager.default
let allowedMediaFiles = ["mp4", "avi"]
func isMediaFile(_ file: URL) -> Bool {
return allowedMediaFiles.contains(file.pathExtension)
}
func getMediaFiles(from folder: URL) -> [URL] {
guard let enumerator = fileManager.enumerator(at: folder, includingPropertiesForKeys: []) else { return [] }
return enumerator.allObjects
.flatMap {$0 as? URL}
.filter { $0.lastPathComponent.first != "." && isMediaFile($0)
}
}
func move(files: [URL], to location: URL) {
do {
for fileURL in files {
try fileManager.copyItem(at: fileURL, to: location)
}
} catch (let error) {
print(error)
}
}
let mediaFilesURL = URL(string: "/Users/xxx/Desktop/Media/")!
let moveToFolder = URL(string: "/Users/xxx/Desktop/NewFolder/")!
let mediaFiles = getMediaFiles(from: mediaFilesURL)
move(files: mediaFiles, to: moveToFolder)
エラーが発生する理由
_URL(string: "/Users/xxx/Desktop/Media/")!
_
スキームなしでURLを作成します。あなたが使用することができます
_URL(string: "file:///Users/xxx/Desktop/Media/")!
_
または、もっと簡単に言えば、
_URL(fileURLWithPath: "/Users/xxx/Desktop/Media/")
_
fileManager.copyItem()
には、宛先ディレクトリだけでなく、ファイル名を含める必要があることにも注意してください。
_try fileManager.copyItem(at: fileURL,
to: location.appendingPathComponent(fileURL.lastPathComponent))
_