4

Из википедии сказано, что robocopy будет пропускать копирование файлов в открытом состоянии.

Однако, когда он тестируется на поведение robocopy, robocopy по-прежнему копирует открытый файл с помощью самого простого текстового редактора в окнах. Зачем?

3 ответа3

5

Во-первых, как правильно заметил @fejyesynb, Блокнот не сохраняет дескриптор активного файла - он открывает файл, быстро читает (или записывает) данные и снова закрывает файл. Данные на экране, но файл фактически все время закрыт.

Во-вторых, Windows унаследовала от MS-DOS концепцию "общих режимов" как простую форму блокировки файлов. При открытии файла вы можете выбрать, использовать его для чтения / записи, только для чтения или нет вообще.

Например, если ваша программа (robocopy) хочет открыть файл для чтения (FileAccess.Чтение), он будет успешным только в том случае, если все существующие файловые дескрипторы разрешают режим общего доступа "чтение" (или если вообще нет никаких дескрипторов открытых файлов). Но если файл был открыт с помощью "share none", вы получите "Файл используется", если попытаетесь открыть его для каких-либо целей.

Вы можете выполнить это в PowerShell, вызвав низкоуровневую систему .NET .IO.File.Функция Open() :

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

4-й параметр может быть любой Системой.Значение перечисления IO.FileShare , например:

  • [System.IO.FileShare]::None - ничего не делиться
  • [System.IO.FileShare]::Read - поделиться прочитанным (заблокировать запись / удаление)
  • [System.IO.FileShare]::ReadWrite - делиться чтением / записью (блокировка удаления)

Когда вы закончите:

$fh.Close()
4

Потому что вы думаете о другом значении "открытый".

Блокнот (и все другие известные мне текстовые редакторы) открывает файл для чтения, а затем вы видите его на экране. Затем он закрывает файл, пока вы все еще можете видеть содержимое (теперь в оперативной памяти).

Если, например, у вас есть fd = open("file.txt", FLAGS); и он (пока) не закрывается методом close(fd) , тогда он не будет скопирован с помощью robocopy.

1

Зависит от того, как файл открыт

Многие приложения загружают весь файл в память и закрывают его, поэтому файл фактически не используется. Это, конечно, нельзя использовать с большими файлами, поэтому редакторы для больших текстовых файлов имеют различные методы для эффективной работы, такие как одновременная загрузка части файла в память

Многие другие держат дескриптор файла открытым, но они не блокируют файл

Блокнот OTOH отображает файл в память, в результате чего файл не выглядит как открытый. Это означает, что сказанное fejyesynb неверно, поскольку оно не загружает файл в ОЗУ

Для получения дополнительной информации вы можете прочитать

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .