web-dev-qa-db-ja.com

FileManagerを使用したファイルのコピー中にエラーが発生しました(スキームのないURLが渡されたため、CFURLCopyResourcePropertyForKeyが失敗しました)

FileManagercopyItem(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)
12
ruhm

エラーが発生する理由

_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))
_
14
Martin R