使用中のファイルの移動—動作方法


31

Windows以外のOSの場合、つまりLinux / Macの場合、次のようなことができることに気付きました。

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

または、私は次のような操作を行うことができます。

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

このすばらしい機能が実際にどのように実装されているかについて、誰かが光を当てることができますか?私はそれについてさらに学ぶためにグーグルに何をすべきかさえ分かりません。

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


1
理論的には、2つの方法が考えられます。両方とも現実です。ファイルはメモリ内にあります。または、ファイルシステムにファイルへの参照があり、参照のみが削除されます。両方とも現実です。参照の事実は、元に戻すプログラムが物を元に戻す方法です。すべてのプログラムがファイルを閉じたときにファイルが実際に削除されるという考えは、無意味に聞こえます。リンクリスト(プログラミングデータ構造、概念をより深く理解するため)について調べることができます。または、特定のファイルシステムについて調べることもできます。
-barlop

回答:


29

ディレクトリエントリは、iノードへの単なるポインタです。iノードには、ファイルに関するメタ情報(名前以外)、およびファイルのデータへのポインター(ある場合)が含まれています。ファイルのコピーを開始すると、iノードへのハンドルを取得します。

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

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

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

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

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

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


5
まさに。私は自分でそれをより良くすることができませんでした。ちなみに、プログラム内にスクラッチファイルストレージを必要とする場合の一般的なトリックは、でファイルを作成し/tmp、すぐにunlink(2)それを作成することです。その時点では、ディレクトリにはファイルがありません(そのため、終了時またはクラッシュ時にクリーンアップするものは何もありません)が、プロセスはまだファイルにアクセスできます。これは、対象のプロパティを示しています。
ノーマングレイ

これは、プログラムが使用中に開いているファイルが削除され、電源障害が発生した場合、取り残されたデータがドライブのスペースを占有したままになることを意味しますか?ファイルを使用するプロセスがクラッシュしたり、強制終了されたりした場合はどうですか?
ジェイソンC 14年

1
@JasonC私はあなたの質問に答えるために応答を更新しました。
BillThor 14年

6

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

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


OS X / HFS +の場合は正しくありません:ファイルをゴミ箱に移動できますが、パーティション間で移動したり、削除したりできません(ゴミ箱を空にするなど)。
ダニエルベック

2

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

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


「ファイルは参照のリストを保持していますか?」
ダニエルベック

ファイルではなく「OSまたはExplorer」である必要があります。
モアブ

2
それは実際にはファイルシステムになります。
-JRobert

OSはファイルシステムを使用して、ファイル内の参照を保存します(ファイルヘッダー構造内のnlinks)-そこに-私たちはすべて幸せです;)
Majenko

1
「参照」は、ファイルへのオープンハンドルとファイルへのハードリンク(最初のファイル名を含む)の両方のプロセスです。参照カウントがゼロになるまで、データブロックは空きとしてマークされず、再利用できません。
mpez0

0

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


1
本当ですが、それはここで起こっていることではありません。ポイントは、最後のハードリンクが削除された後も、すべてのプロセスがそれらのハンドルを閉じるまでファイルは保持されるということです。
sleske
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.