ウィキペディアから、robocopyは開いた状態のファイルのコピーをスキップすると言われています。
ただし、robocopyの動作がテストされている場合でも、robocopyは、Windowsで最も単純なテキストエディターによって開かれたファイルをコピーします。どうして?
まず、@ 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()
あなたは「オープン」の別の意味を考えているからです。
メモ帳(および私が知っている他のすべてのテキストエディタ)は、読み取るためにファイルを開き、画面に表示します。次に、内容を表示している間にファイルを閉じるファイルを表示します(現在はRAMにあります)。
たとえば、fd = open("file.txt", FLAGS);
があり、それがclose(fd)
によって(まだ)閉じられていない場合、robocopyではコピーされません。
ファイルを開く方法によって異なります
多くのアプリケーションはファイル全体をメモリにロードして閉じます。したがって、実際にはファイルは使用されていません。もちろん、これは巨大なファイルでは使用できません。したがって、大きなテキストファイルのエディタには、ファイルの一部を一度にメモリにロードするなど、効率的に機能するさまざまな手法があります。
他の多くはファイルハンドルを開いたままにしますが、 ファイルをロックしないでください
メモ帳OTOH ファイルをメモリにマップします 、開いているように見えないファイルになります。これは、ファイルをRAMにロードしないため、fejyesynbが言ったことは正しくないことを意味します
詳細については、