28

この質問は、Stack Overflowには十分に技術的であり、Androidにはプログラミング指向であると思います。新しいスマートフォンで何かをしたので、Android(または必要に応じてJavaまたはLinux)でファイルがどのように処理されるかについて興味があり、それがどのように発生したか知りたいと思っています。

Bluetooth経由でラップトップからAndroidフォンにファイルを転送していました。ファイルエクスプローラーで新しいファイルを確認し、完全に転送されたと想定して、から/sdcard/bluetoothに移動しました/sdcard/torrents。そうしてから、実際にはまだ転送されていることに気づきました。驚いたことに、それは正常に完了し、電話の通知アイコンと、両側の手動MD5チェックで確認されました。ほとんどのシステムでは、ファイルの移動によってクラッシュが発生していました。

この転送が成功した理由は何ですか?一般に、ファイルパスはファイルシステム(この場合はSDカード)上のファイルの場所とは別のものであることを認識しています。Bluetoothアプリがファイルへのハンドルを開いたと思います。ファイルを移動すると、「開いているファイル」のテーブルが新しいパスで更新されました。この機能は一般的にどのLinuxシステムにも当てはまりますか?書き込まれているファイルに対してを実行mvし、新しい場所にあるコピーが正しいことを期待できますか?

4

1 に答える 1

55

同じファイルシステム内でファイルを移動する場合、ファイル自体(iノード)はまったく移動されません。変更されるのは、そのファイルシステムのディレクトリエントリだけです。mv(この場合に呼び出されるシステムコールは、rename(2)そのページで追加情報と制限を確認してください。)

プロセスがファイルを開くと、ファイル名がOSに渡され、どのファイルが意味されているかが示されますが、返されるファイル記述子はその名前にまったくリンクされていません(ファイル名を取り戻すことはできません)– iノードにリンクされています。
(同じファイルシステム内の)ファイルの名前を変更してもiノードは変更されないため、iノードを開いているプロセスはファイルの読み取りと書き込みを継続できます。変更はありません。ファイル記述子は引き続き有効であり、適切なデータを指します。

ファイルを削除しても同じです。プロセスは、ディレクトリエントリを介してファイルにアクセスできなくなった場合でも、ファイルからの読み取りと書き込みを続けることができます。df(これにより、ディスクがいっぱいであると報告されるが、報告するduスペースがはるかに少ないという混乱した状況につながる可能性がありdfます。まだ開いている削除済みファイルに割り当てられたブロックは、それらのプロセスがファイル記述子を閉じるまで解放されません。 )。

移動によってファイルがファイルシステム間で移動する場合、mviノードは各ファイルシステムに固有であるため、動作は異なります。その場合、mvは実際にデータをコピーし、宛先ファイルシステムに新しいiノード(およびディレクトリエントリ)を作成します。コピーが終了すると、古いファイルはリンク解除され、上記のように開いているファイルハンドルがない場合は削除されます。
あなたの場合、ファイルシステムの境界を越えた場合、宛先に部分的なファイルがあります。また、アップロードプロセスは、簡単にアクセスできない削除済みファイルに問題なく書き込み、アップロードが完了するまでファイルシステムがいっぱいになる可能性があります。アップロードが完了すると、iノードがドロップされます。

あなたが面白いと思うかもしれないUnixとLinuxに関するいくつかの投稿:

于 2012-08-05T18:47:54.540 に答える