Почему robocopy все еще копирует открытый файл, открытый с помощью TXT-редактора в Windows

682
cuda

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

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

4
Возможный дубликат [Почему Windows не предупреждает о том, что файл используется некоторыми программами?] (Https://superuser.com/questions/853420/why-is-windows-not-warning-about-file-in-use-for -certain-программа) phuclv 6 лет назад 1

3 ответа на вопрос

5
grawity

Во-первых, как правильно заметил @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() 
4
fejyesynb

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

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

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

Таким образом, как я могу смоделировать случай, чтобы открыть файл простым способом? Я хотел бы показать свойства robocopy, чтобы избежать копирования свойств открытого файла. Но не могу найти простой способ открыть его cuda 6 лет назад 0
Самый простой способ, которым я могу придумать (в Windows), - это создать простую программу на C, которая открывает файл, спит, скажем, 60 секунд, а затем закрывается. Затем у вас будет 60 секунд для проверки робокопии. fejyesynb 6 лет назад 0
@cuda Для более конкретного ответа откройте новый вопрос (1 вопрос на пост на SE) fejyesynb 6 лет назад 0
Помимо создания программы и размещения на этом удаленном сессионном компьютере более простого способа с помощью сценариев Windows? не имею иде C программы / JAVA / C # cuda 6 лет назад 0
Я не думаю, что сценарии достаточно низкого уровня для системных вызовов `open` и` close` fejyesynb 6 лет назад 0
stackexchange применяет правила для создания другого вопроса через 40 минут. Есть ли какой-либо другой способ сохранить файл открытым без написания самой простой программы на С, не имеющей инструментов IDE или привилегий для установки cuda 6 лет назад 0
угадайте, что-то вроде этого https://social.technet.microsoft.com/Forums/en-US/a6231646-57df-43ca-86db-dc04d93c32de/opening-text-file-with-vbscript?forum=ITCG cuda 6 лет назад 0
открыл еще один вопрос здесь https://superuser.com/questions/1360787/how-to-simply-keep-a-file-in-open-status-without-help-of-program-in-c-language-e, но кажется, не работает с этими сценариями ... файл все еще копируется ... robocoy не игнорирует копирование cuda 6 лет назад 0
@fejyesynb: Практически все * выше уровня Cmd * может справиться с этим. Например, PowerShell имеет полный доступ к среде выполнения .NET. grawity 6 лет назад 0
@ Grawity будет очень признателен, если вы могли бы дать некоторое представление о том, как работать, чтобы открыть и удерживать дескриптор файла без закрытия файла, а затем я запускаю robocopy, чтобы посмотреть, действительно ли он работает, чтобы избежать копирования открытого файла. cuda 6 лет назад 0
1
phuclv

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

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

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

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

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

Похожие вопросы