ホームページ » の仕方 » LinuxやOS Xの場合のようにWindowsの使用中のファイルを変更できないのはなぜですか?

    LinuxやOS Xの場合のようにWindowsの使用中のファイルを変更できないのはなぜですか?


    LinuxとOS Xを使用している場合、オペレーティングシステムが現在使用中のファイルを削除するのを妨げることはありません。Windowsでは、削除することを明示的に禁止されます。何ができる? UNIXから派生したシステムで使用中のファイルを編集および削除できますが、Windowsではできません。?

    本日の質疑応答セッションは、コミュニティ主導のQ&A Webサイトのグループである、Stack Exchangeの下位区分であるSuperUserの好意により提供されます。.

    質問

    SuperUserの読者the.midgetは、LinuxとWindowsで使用中のファイルの扱いが異なる理由を知りたいのです。

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

    そのため、Linuxでできることのように、舞台裏で何が起こっていて、彼がWindowsで必要以上に物事を削除するのを妨げているのか?

    答え

    SuperUserの貢献者はthe.midgetの状況にいくつかの光を当てました。驚いて書いている:

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

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

    David Schwartzは、このアイデアをさらに詳しく説明し、物事をどのように理想的にすべきか、またそれらが実際にどのように行われているかを強調します。

    Windowsはデフォルトで自動ファイルロックを使用します。 UNIXのデフォルトは手動の協調的ファイルロックです。どちらの場合も、デフォルトは上書きできますが、どちらの場合も通常はそうではありません。.

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

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

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

    私の意見では、すべてのプログラムがその共有モードとオープンモードを賢明にそして賢明に扱った失敗ケースを選んだなら、WindowsメソッドはUNIXメソッドよりはるかにうまくいくでしょう。しかし、UNIXの方法は、コードがこれらの問題について考えることを気にしないのであればよりうまく機能します。残念ながら、基本的なC / C ++ APIは、共有モードを処理して競合するオープンを処理する方法では、WindowsファイルAPIにうまくマッピングできません。そのため、最終結果は少し面倒です。.

    ファイル処理に対する2つの異なるアプローチは、2つの異なる結果をもたらします。.


    説明に追加するものがありますか?コメントの中で消してください。他の技術に精通したStack Exchangeユーザーからの回答をもっと読みたいですか?こちらのディスカッションスレッドをチェックしてください。.