Windowsからadbコマンドを使用して、マルチバイト文字が含まれるファイルを作成してはいけません。MacやLinuxなどのWindows以外のPCから正常にアクセスできなくなる他、Androidアプリからもファイルを正常に扱えなくなります。
再現手順
以下はその手順です。
adb shell mkdir /sdcard/Download/test
adb shell touch /sdcard/Download/test/こんにちは.txt
adb shell ls /sdcard/Download/test
作業場所はダウンロードフォルダにしました。後でエクスプローラやAndroid File Transferで確認がしやすいためです。
マルチバイト文字を含むファイルは、必ずマルチバイト文字を含まないフォルダ内に作成して下さい。作成したファイルが削除できなくなる、という最悪の事態を、フォルダごと削除することで回避することができます。
lsコマンドで見ると、正しく作成されているように見えます。
Cygwinからadbコマンドでファイル名を確認してみます。
正しく表示されません。
WindowsのコマンドプロンプトはCP932という、いわゆるShift_JISが入出力に用いられます。一方、AndroidおよびCygwinはUTF-8が入出力に用いられます。要するにShift_JISの文字コードを用いてファイルを作成してしまった、という状態なのです。
この状態でエクスプローラを見てみます。
はい、エクスプローラ上でファイルが見当たりません。Windowsだけでもうおかしな状態になってしまっています。
では、このAndroid端末をMacに接続して状態を確認してみましょう。
まずは、adbコマンドを叩いてみます。
ファイル名が正しく取得できません。
Android File Transferで見てみます。
Android File Transferではtestフォルダ内のファイルが検出できません。
Androidアプリのファイルマネージャを用いて確認してみます。ここではES File Explorerというファイルマネージャを用います。
文字化けしていますが検出はできています。では、これを削除してみましょう。
ファイルを選択して、削除ボタンをタップすると:
確認ダイアログが表示されました。なんだかうまくいきそうな気配です。このままOKをタップします。
消えました。やった!
念のため、再読み込みをしてみます。
なんか復活してる!!!
正確には、削除に失敗しているのに「成功」というメッセージを出して、表示上削除できたように見せる、という処理になっているのでしょう。
復旧方法
文字化けするファイルの消し方はいくつかあります。
ひとつは、ワイルドカードを用いてコマンドラインから消す方法です。
ただし、この方法は確実ではなく、失敗することもあります。成功/失敗はおそらくファイル名に依存しているのではないかと思います。
つぎは、親フォルダごと消す方法です。
こんな感じで削除することができます。これが確実ですが、削除可能なフォルダ配下になければならないという制約があります。
さいごは、コマンドプロンプトから削除する方法です。
ファイル名を指定して確実に削除することができます。ただし、コマンドプロンプトではUTF-8のマルチバイト文字が逆に文字化けするので、対象ファイルがマルチバイト文字を含むパスに移動していたりすると、この方法は使えません。なんとかMac/Linux/Android上でマルチバイト文字が含まれないパスに移動しましょう。
まとめ
- Windowsからadbでマルチバイト文字のファイルを作成しない
- Androidにマルチバイト文字のファイルを作成しない
- 最悪Android端末を工場出荷時状態に初期化