はじめに
以前に、実機iPhoneから内蔵のサウンドファイルを抜き出して、Macでファイルに復元するため書いたコードです。
iOS、iPadOS、MacOSで動作します。
パス名とファイル実体
struct FileItem: Encodable, Decodable {
let filename: String
let content: Data
}
ファイルをJSONにエンコードする
もちろん、そのデバイスでアクセス可能なパス/ファイルである必要があります。
アクセスできるファイルなら、なんでも抜き出せます。
//path: 抜き出すファイルのフルパス名
//return: JSON化した文字列
func dumpFile(path: String) -> String {
do {
let encoder = JSONEncoder()
let dataURL = URL(fileURLWithPath: path)
let binaryData = try Data(contentsOf: dataURL, options: [])
let fileItem = FileItem(filename: path, content: binaryData)
let encodedData = try encoder.encode(fileItem)
let json = String(data: encodedData, encoding: .utf8)!
return json
} catch let error {
return error.localizedDescription
}
}
読み出したファイルがJSONにエンコードした“文字列”になって返るので、その文字列を別なデバイスにコピーして、ファイルに保存します(文字コードはUTF-8)。
JSON文字列の受け渡しは人力です。
同じアカウントでサインインしているAppleデバイス間では、クリップボードが共有されるので、「iPhoneでコピーしてMacにペーストする(その逆も)」が普通にコピペで実現できるのが楽です。
ファイルに復元する
入力ファイルと同じディレクトリに、JSONをデコードして元のファイル名のファイルに復元します。
//path: JSONを保存したファイルパス
//同じディレクトリに復元したファイルを出力
func restoreFile(path: String) {
do {
let url = URL(fileURLWithPath: path)
let jsonString = try String(contentsOf: url, encoding: .utf8)
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let fileItem = try decoder.decode(FileItem.self, from: jsonData)
let inputUrl = URL(fileURLWithPath: fileItem.filename)
let dirUrl = url.deletingLastPathComponent()
let outputUrl = dirUrl.appendingPathComponent(inputUrl.lastPathComponent)
try fileItem.content.write(to: outputUrl)
} catch let error {
print(error)
}
}
おわりに
またいつか必要になるかも知れないので、残しておきました。