Почему robocopy все еще копирует открытый файл, открытый редактором txt в windows
Из википедии сказано, что robocopy будет пропускать копирование файлов в открытом состоянии.
Однако, когда он тестируется на поведение robocopy, robocopy по-прежнему копирует открытый файл с помощью самого простого текстового редактора в окнах. Зачем?
3 ответа
Во-первых, как правильно заметил @fejyesynb, Блокнот не сохраняет дескриптор активного файла - он открывает файл, быстро читает (или записывает) данные и снова закрывает файл. Данные на экране, но файл фактически все время закрыт.
Во-вторых, Windows унаследовала от MS-DOS концепцию "общих режимов" как простую форму блокировки файлов. При открытии файла вы можете выбрать, использовать его для чтения / записи, только для чтения или нет вообще.
Например, если ваша программа (robocopy) хочет открыть файл для чтения (FileAccess.Read), это будет успешно выполнено, только если все существующие файловые дескрипторы разрешают режим общего доступа "чтение" (или если нет никаких открытых файловых дескрипторов в все). Но если файл был открыт с помощью "share none", вы получите "Файл используется", если попытаетесь открыть его для каких-либо целей.
Вы можете выполнить это в 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, например:
[System.IO.FileShare]::None
- не делись ничем[System.IO.FileShare]::Read
- поделиться прочитанным (заблокировать запись / удаление)[System.IO.FileShare]::ReadWrite
- разделить чтение / запись (блокировка удаления)
Когда вы закончите:
$fh.Close()
Потому что вы думаете о другом значении "открытый".
Блокнот (и все другие известные мне текстовые редакторы) открывает файл для чтения, а затем вы видите его на экране. Затем он закрывает файл, пока вы все еще можете видеть содержимое (теперь в оперативной памяти).
Если, например, у вас есть fd = open("file.txt", FLAGS);
и это (пока) не закрыто close(fd)
, то это не будет скопировано с Robocopy.
Зависит от того, как файл открыт
Многие приложения загружают весь файл в память и закрывают его, поэтому файл фактически не используется. Это, конечно, нельзя использовать с большими файлами, поэтому редакторы для больших текстовых файлов имеют различные методы для эффективной работы, такие как одновременная загрузка части файла в память
Многие другие держат дескриптор файла открытым, но они не блокируют файл
Блокнот OTOH отображает файл в память, в результате чего файл не выглядит как открытый. Это означает, что сказанное fejyesynb неверно, поскольку оно не загружает файл в ОЗУ
Для получения дополнительной информации вы можете прочитать