web-dev-qa-db-ja.com

robocopyがWindowsのテキストエディタで開いた開いているファイルをコピーする理由

ウィキペディアから、robocopyは開いた状態のファイルのコピーをスキップすると言われています。

ただし、robocopyの動作がテストされている場合でも、robocopyは、Windowsで最も単純なテキストエディターによって開かれたファイルをコピーします。どうして?

4
cuda

まず、@ fejyesynbが正しく指摘しているように、メモ帳はアクティブなファイルハンドルを保持しません。ファイルを開き、データをすばやく読み取り(または書き込み)、ファイルを再度閉じます。 dataが画面に表示されていますが、ファイルは実際には常に閉じられています。

次に、WindowsはMS-DOSから、ファイルロックの単純な形式として「共有モード」の概念を継承しています。ファイルを開くときに、ファイルを読み取り/書き込み用に共有するか、読み取り専用にするか、まったく共有しないかを選択できます。

たとえば、プログラム(robocopy)が読み取り用にファイル(FileAccess.Read)を開きたい場合、既存のすべてのファイルハンドルで許可されていれば、only成功します。 「読み取り」共有モード(または開いているファイルハンドルがまったくない場合)。ただし、ファイルを「share none」で開いた場合、anyの目的でファイルを開こうとすると、「Fileinuse」が表示されます。

これは、PowerShellで、低レベルの.NET System.IO.File.Open() 関数を呼び出すことで実行できます。

$fh = [System.IO.File]::Open($path,
                             [System.IO.FileMode]::Open,
                             [System.IO.FileAccess]::Read,
                             [System.IO.FileShare]::None)

4番目のパラメーターは、任意の System.IO.FileShare enum 値にすることができます。次に例を示します。

  • [System.IO.FileShare]::None –何も共有しない
  • [System.IO.FileShare]::Read –共有読み取り(ブロック書き込み/削除)
  • [System.IO.FileShare]::ReadWrite –読み取り/書き込みの共有(ブロック削除)

完了したら:

$fh.Close()
5
user1686

あなたは「オープン」の別の意味を考えているからです。

メモ帳(および私が知っている他のすべてのテキストエディタ)は、読み取るためにファイルを開き、画面に表示します。次に、内容を表示している間にファイルを閉じるファイルを表示します(現在はRAMにあります)。

たとえば、fd = open("file.txt", FLAGS);があり、それがclose(fd)によって(まだ)閉じられていない場合、robocopyではコピーされません。

3
fejyesynb

ファイルを開く方法によって異なります

多くのアプリケーションはファイル全体をメモリにロードして閉じます。したがって、実際にはファイルは使用されていません。もちろん、これは巨大なファイルでは使用できません。したがって、大きなテキストファイルのエディタには、ファイルの一部を一度にメモリにロードするなど、効率的に機能するさまざまな手法があります。

他の多くはファイルハンドルを開いたままにしますが、 ファイルをロックしないでください

メモ帳OTOH ファイルをメモリにマップします 、開いているように見えないファイルになります。これは、ファイルをRAMにロードしないため、fejyesynbが言ったことは正しくないことを意味します

詳細については、

1
phuclv