LoginSignup
0
1

[Swift] デバイスからファイルをダンプして、他のデバイスで復元する

Last updated at Posted at 2023-08-21

はじめに

以前に、実機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)
    }
}

おわりに

またいつか必要になるかも知れないので、残しておきました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1