web-dev-qa-db-ja.com

使用中のファイルの移動-どのように機能しますか?

Windows以外のOSでは... linux/macのようなことができることに気づきました。-目的に応じてZipを友達に送信します-転送中にファイルを削除します

そして、転送は失敗しません。

または、次のような操作を行うことができます。-ムービーを開始-ファイルを消去-ムービーはまだ最後まで再生されます(メモリにバッファリングされるだけでなく、ディスクから読み取られます)

前述のように、ファイルは「削除」されていますが、実際にはファイルシステムの別の場所(ゴミ箱ディレクトリなど)に移動されています。したがって、OSは、ファイルに直接アクセスするのではなく、移動時に更新されるファイルでポインタを使用しているように見えます。

この素晴らしい機能が実際にどのように実装されているかについて誰かが光を当てることはできますか?私はそれについてもっと学ぶためにグーグルに何をすべきかさえわからない。

ありがとうございました。

32
Mario Zigliotto

ディレクトリエントリは、iノードへのポインタにすぎません。 iノードには、ファイルのメタ情報(名前以外)と、ファイルのデータ(存在する場合)へのポインタが含まれています。ファイルのコピーを開始すると、iノードへのハンドルが取得されます。

オペレーティングシステムは、iノードへの参照の数を維持します。 iノードへの参照がある限り、iノードとファイルのデータは保持されます。 iノードへの参照がすべて削除されると、iノードが削除され、ファイルに必要なスペースが解放されます。

コピーのためにファイルを開いているので、プロセスがファイルを閉じるまでファイルは保持されます。これは、ファイル転送が完了したときに発生し、コピープロセスが失敗した場合に発生します。ファイルの転送が途中で失敗し、ファイルへのすべてのハードリンクを削除した場合、転送を正常に再開できなくなります。

編集:他の人が指摘したように、同じデバイスでのファイルの移動は、データを移動せずに行われます。代わりに、新しいディレクトリエントリが宛先ディレクトリに作成され、元のディレクトリエントリは削除されます。

同じファイルに対して複数のディレクトリエントリを持つことが可能です。これらはハードリンクと呼ばれます。これらは、元のエントリを削除せずに、ファイルの新しいディレクトリエントリを作成することによって作成されます。ファイルシステムのiノードには、ファイルを指すディレクトリエントリの数を記録するための参照カウントがあります。

EDIT2:プロセスがクラッシュまたは強制終了された場合、メモリ内のアクセス数がゼロになるため、ファイルは完全に削除されます。これは、プログラムが正常に終了したときに発生するアクションです。

電源障害またはその他の不規則なシステムシャットダウンの場合、ディスクを完全にマウントする前に、fsck(ファイルシステムチェック)が必要です。ディスク上のiノードとディレクトリ構造の状態に応じて、スペースが回復するか、ファイルがディレクトリに残るか、lost+foundディレクトリに新しいエントリが作成されます。結果は、ディスクにフラッシュされたか、ファイルシステムジャーナルに書き込まれた変更によって異なります。

30
BillThor

Matt Jenkinsが説明したように、OS(ファイルシステム)は、アプリケーションによって開かれたままになっているファイルを追跡します。プロセスがファイルを開いたままにしている限り、そのデータはディスク上に残ります(削除されていて、他のプログラムから見えなくなったり、アクセスできなくなったりした場合でも)。

この結果として、ファイルが占有するスペースは、それを使用する最後のプロセスがファイルを閉じた後にのみ再利用できることに注意してください。これは、FAQです:「 'df'コマンドはパーティションがいっぱいであるのに、 'du'は空き領域を報告します」(例 http:// batleth .sapienti-sat.org/projects/FAQs/ext3-faq.html )。スペースを解放する必要がある場合、大きなファイル(ログファイルなど)を削除するだけでは不十分であり、プロセスがそれらを保持していないことも確認する必要があります開く(通常はログファイルの問題)。

6
sleske

それは実際には非常に簡単です。ファイルは参照のリストを維持します-ファイルにアクセスしているプロセス。ファイルを削除すると、ディレクトリからリストが削除されるだけで、ファイル自体は削除されません。ファイルを開いたままのプログラムは、引き続きファイルにアクセスできます。実際に削除されるのは、そのファイルにアクセスしているすべてのプログラムがファイルを閉じたときだけです。

また、ファイルを移動すると(同じファイルシステム内にある場合)、ファイルは実際には移動せず、ファイルが存在するディレクトリへのポインターが変更されるだけです。

2
Majenko

UNIXファイルシステムでは、ファイルに1つ以上の ハードリンク を含めることができます。ファイルは、少なくとも1つ存在する限り存続します。最後のファイルが削除されると、ファイルのスペースが解放されます。上記のリンクは、あなたにもっと読むための出発点を与えます-特に「リンクカウンター」セクションを見てください。

0
JRobert