回答:
Linuxは、Windowsとはまったく異なる方法でファイルを削除します。最初に、* unixネイティブファイルシステムでのファイルの管理方法について簡単に説明します。
ファイルは、と呼ばれるマルチレベル構造でディスクに保持されますi-node
。各iノードには、単一のファイルシステム上で一意の番号があります。iノード構造は、ファイルのサイズ、ファイルに割り当てられたデータブロックなど、ファイルに関するさまざまな情報を保持しますが、この答えのために最も重要なデータ要素はlink counter
です。directories
ファイルについてのレコードを保持するファイルです。各レコードには、参照するiノード番号、ファイル名の長さ、およびファイル名自体があります。このスキームにより、「ポインタ」、つまり、異なる名前の異なる場所にある同じファイルへの「リンク」を持つことができます。iノードのリンクカウンターは、実際にこのiノードを参照するリンクの数を保持します。
何らかのプロセスがファイルを開くとどうなりますか?最初に、open()
関数はファイルレコードを検索します。次に、このiノードのメモリ内iノード構造が既に存在するかどうかを確認します。これは、一部のアプリケーションが既にこのファイルを開いている場合に発生する可能性があります。それ以外の場合、システムは新しいメモリ内iノード構造を初期化します。次に、システムはメモリ内のiノード構造のオープンカウンターを増やし、ファイル記述子をアプリケーションに返します。
ファイルを削除するためのLinuxライブラリ呼び出しはと呼ばれunlink
ます。この関数は、ディレクトリからファイルレコードを削除し、iノードのリンクカウンターをデクリメントします。システムがメモリ内のiノード構造が存在し、そのオープンカウンターがゼロでないことを検出した場合、この呼び出しはアプリケーションに制御を返します。それ以外の場合、リンクカウンターがゼロになったかどうかをチェックし、ゼロになった場合、システムはiノードとiノード自体に割り当てられたすべてのブロックを解放し、アプリケーションに戻ります。
アプリケーションがファイルを閉じるとどうなりますか?この関数close()
は、オープンカウンターをデクリメントし、その値をチェックします。値がゼロ以外の場合、関数はアプリケーションに戻ります。それ以外の場合、iノードリンクカウンターがゼロかどうかをチェックします。ゼロの場合、ファイルとiノードのすべてのブロックを解放してから、アプリケーションに戻ります。
このメカニズムにより、開いているファイルを「削除」できます。同時に、ファイルを開いたアプリケーションは、ファイル内のデータに引き続きアクセスできます。したがって、JREは、あなたの例では、ディスク上に別の更新されたバージョンが存在する間、ファイルのバージョンを開いたままにします。
さらに、この機能を使用すると、通常の操作を中断することなく、システム内のglibc(libc)(すべてのアプリケーションのコアライブラリ)を更新できます。
20年前、DOSでFAT以外のファイルシステムを知りませんでした。このファイルシステムには、異なる構造と管理原則があります。これらの原則では、ファイルを開いたときにファイルを削除することはできません。そのため、DOSおよび最近のWindowsは、開いているファイルの削除要求を拒否する必要があります。おそらくNTFSは* nixファイルシステムと同じ動作を許可しますが、Microsoftはファイル削除の習慣的な動作を維持することを決定しました。
これが答えです。短くはありませんが、今ではアイデアがあります。
編集:Win32
混乱の原因に関する良い読み物:https :
//blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 @Jonへのクレジット
ren MonsterB.jar MonsterB.ja_
-動作するはずです。dllファイルとexeファイルで確実に機能します。
fopen
コマンドはフラグを指定CreateFile
して呼び出しているFILE_SHARE_DELETE
ため、ファイルを開くほとんどのプログラムでは許可されません。