💾

【Flutter】アプリ内ストレージに書き込んだファイルをアプリ外から確認したい

に公開

path_providerライブラリで、アプリ内ストレージにファイルを保存する際、
デバッグ時などにアプリから参照・確認したい場合はどうしたらいいのか、とふと思ったので調べてみました。

※ ここで検証として使用する処理は、以下の数行だけです。

final appDir = await getApplicationDocumentsDirectory(); // ← path_providerの関数
final file = File('${outputDir.path}/log.txt');
await file.writeAsString('ログの内容');


path_provider

少しだけpath_providerについても触れておきます。

path_providerは、ファイルシステム上でよく使われる path を見つけるためのライブラリです。

OS によって使用できる関数があることは注意が必要です。


path_provider の readme から引用


Android

2つの関数の実行結果を例に見ていきます。

  • getApplicationDocumentsDirectory() => /data/user/0/<packageName>/app_flutter
  • getDownloadsDirectory() => /storage/emulated/0/Android/data/<packageName>/files/downloads

内部ストレージか外部ストレージかの違いはあるが、両者はどちらもアプリ専門領域であり、ユーザーからは見えません。(アクセスできません。)
※ (内部か外部かで、制限や容量などは若干異なりますが、ここでは割愛します。)

上記の アプリ専用領域 に関しては、Android の場合は AndroidStudio を使用すれば確認することができます。

確認方法の手順は以下です。

  1. Android Studio を開く
  2. Header メニューから、View/ToolWindow/DeviceExplorer を選択
  3. 取得したパスを辿り、該当ファイルを選択して表示 or ダウンロード


ユーザーがアクセスできる場所に保存したい場合は、アクセス可能なフォルダ階層を直接指定してあげると、アクセスは可能となります。

final file = File('/storage/emulated/0/Download/output/log.txt');
await file.writeAsString('ログの内容');


iOS

Android と同様に、2つの関数の実行結果を例に見ていきます。

  • getApplicationDocumentsDirectory() => /var/mobile/Containers/Data/Application/<AppId>/Documents
  • getDownloadsDirectory() => /var/mobile/Containers/Data/Application/<AppId>/Downloads

Android 同様、これらはどちらもアプリ専門領域であり、ユーザーからは見えません(アクセスできません)。

上記の アプリ専用領域 に関しては、シミュレーターであれば、Finder から確認することができます。

確認できるパスは以下です。
/Users/<user>/Library/Developer/CoreSimulator/Devices/<DeviceID>/data/Containers/Data/Application/<AppID>/


実機の場合は、path からは直接確認はできませんが、OS の権限を付与すれば、実機上で直接確認できる(ユーザーがアクセスできる)ようになります。

info.plist
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>


iPhone で ファイル アプリから確認ができるようになります。

備考

  • Android の Files アプリで表示される「内部ストレージ」画面のディレクトリ名は、/sdcard/です。(Android は"SD カード" もあるのでややこしいですが、、、)
    「仮想 SD カード ≒ 内部ストレージ ≒ /sdcard」

  • /sdcard/storage/emulated/0は同じディレクトリを指します。
    /storage/emulated/0のシンボリックリンクが/sdcardみたいです。

GitHubで編集を提案
NCDCエンジニアブログ

Discussion