Linux / Macでできるように、Windowsで読み込まれているファイルの名前を変更できないのはなぜですか?


23

Linuxを使い始めて以来、私を困惑させたものの1つは、ファイルの名前を変更したり、読み取り中にファイルを削除したりできることです。例として、再生中に誤ってビデオを削除しようとしたことがあります。私は成功しました。そして、ファイルが現時点で使用されているかどうかを気にせずに、ファイル内のほぼすべてのものを変更できることを知って驚いた。


2
ロックされたファイルの名前を変更しても、Windowsでは問題ありません。通常、削除は、FILE_SHARE_DELETEオプションをオンにしてファイルを開くプログラムはほとんどありません。
ハンスパッサン

実際にそれを削除したのではなく、それがあったディレクトリからリンクを解除しただけです。ファイルはまだ存在し、ファイルシステムに名前がない場合があります。(/proc開いているプログラムを介してファイルシステムにまだ名前があります。)ファイルへの参照が残っていない場合にのみ、ファイルを本当に削除できます。これは自動的に行われます。
デビッドシュワルツ

回答:


36

Windowsでファイルを開いたり実行したりするたびに、Windowsはファイルを所定の位置にロックします(これは単純化ですが、通常は真です。)プロセスによってロックされているファイルは、そのプロセスが解放するまで削除できません。これが、Windowsがそれ自体を更新する必要があるときはいつでも、それを有効にするために再起動が必要な理由です。

一方、LinuxやMac OS XなどのUnixライクなオペレーティングシステムは、ファイルをロックするのではなく、基盤となるディスクセクターをロックします。これはささいな違いに見えるかもしれませんが、ファイルシステムの目次のファイルのレコードは、既にファイルを開いているプログラムを邪魔することなく削除できることを意味します。そのため、実行中または使用中のファイルを削除できます。ファイルテーブルのエントリがなくなっても、何らかのプロセスがそのハンドルを開いている限り、ディスク上に存在し続けます。


2
この答えをありがとう。それは私にはるかに違いを説明します。また、大きなファイル/ビデオをロードしても膨大な量のRAMが使用されない理由の説明にも役立ちます。そうしないと、1つの大きなビデオを再生するとシステム全体が動かなくなる可能性があります。
ジェリーサラビア

4
使用中のファイルを削除し、それをLinuxに戻したい場合、この質問で説明されているように、ファイルのエントリを/ procで見つけることができます。
ケンブルーム

2
これはやや一般化されたものです。最近のすべてのWindows更新(Windows 7)で再起動が必要なわけではなく、Linuxで十分なことをしました。
アランB

10

Windowsのデフォルトは、自動で必須のファイルロックです。UNIXはデフォルトで手動の協調ファイルロックを行います。どちらの場合もデフォルトは上書きできますが、どちらの場合も通常は上書きされません。

古いWindowsコードの多くはfopen、ネイティブAPI(などの関数)ではなく、C / C ++ API(などの関数)を使用していますCreateFile。C / C ++ APIでは、強制ロックがどのように機能するかを指定する方法は提供されていないため、デフォルトを取得します。デフォルトの「共有モード」は、「競合する」操作を禁止する傾向があります。書き込み用にファイルを開くと、実際にファイルに書き込みを行わない場合でも、書き込みは競合すると見なされます。名前の変更についても同じです。

そして、ここから悪化します。C / C ++ APIには、読み取りまたは書き込み用に開くこと以外に、ファイルをどうするかを指定する方法がありません。したがって、APIは、ユーザーが合法的な操作を実行することを前提としています。ロックは必須であるため、コードが競合する操作を実行するつもりはなく、別の目的でファイルを開いているだけであっても、競合する操作open許可するが拒否されます。

したがって、コードがC / C ++ APIを使用する場合、またはこれらの問題を特に考慮せずにネイティブAPIを使用する場合、開いているすべてのファイルで可能な操作の最大セットを防止し、可能な操作がない限りファイルを開くことができなくなります開かれた後、それで実行することができます競合していません。

私の意見では、すべてのプログラムが共有モードとオープンモードを賢明に選択し、障害のケースを正常に処理した場合、Windowsの方法はUNIXの方法よりもはるかにうまく機能します。ただし、コードがこれらの問題を気にしない場合は、UNIXメソッドの方がうまく機能します。残念ながら、基本的なC / C ++ APIは、共有モードと競合するオープンを適切に処理する方法でWindowsファイルAPIにうまくマッピングされません。そのため、最終的な結果は少し乱雑です。


0

これは非常に興味深い質問であり、実行可能な答えについて考えさせられました。ここで他の人がバックアップを提供できることを願っています。

WindowsとLinuxの両方を使用していますが、これにも気づきました。私はvimのユーザーでもあります。Vimはテキストファイルを「バッファ」またはRAMに読み込み、保存するまで実際のファイルに触れません。Linuxは一般に、すべてのファイルに対してこの種のアクションを実行している可能性があります。

ビデオを例にとると、ビデオ、可能であればすべてをRAMに読み込み、簡単にアクセス、シーク、ジャンプ可能なビデオのコピーを取得します。ファイルが大きすぎると、Linuxがビデオ全体、おそらく大きな塊を読み取れない可能性があるため、問題が発生する可能性があります。プレーヤーがバッファリングされたビデオの最後に到達すると、ファイルの読み取りを再試行します。あなたがビデオを削除した場合、それはあなたのためにひどいです。

Windowsは、それを許可しないため、場合によってははるかに「安全な」OSです。Linuxと同じ方法でファイルをバッファリングしますが、作業中または表示中のファイルをユーザーまたは他のプログラムが変更できないように、ファイルロックも追加します。これにより、ファイルがそのまま保持され、ユーザーまたは他のプログラムが互いの変更を上書きすることがなくなります。


実際に削除することはできません。移動して名前を変更するだけです。
ダニエルベック

2
あなたはそれを「rm」できます。それはそれを削除するのに十分近いです。
クリスムーア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.