Как заблокировать файл в Windows, не меняя его и не используя сторонние инструменты?

24

Есть ли способ заблокировать файл с помощью встроенных инструментов, чтобы его нельзя было удалить или перезаписать?

Для тестирования сценариев копирования мне нужно lock files temporarilyпроверить обработку ошибок в сценариях. До XP я использовал загрузку файла в debug.exe, чтобы заблокировать его.

Есть ли способ в Windows 7 (и позже)?

Edit
Я знаю, что есть программы, которые делают это. У меня вопрос, есть ли встроенный механизм в Windows. Иногда мне приходится проверять скрипт на ПК, и я не хочу устанавливать для этого новые программы.

Edit2
Вот также хорошие предложения: Как целенаправленно заблокировать файл? , которые, однако, нужны сторонние инструменты или изменить файл для блокировки.

болотно-покачивания
источник
Трюк с блокнотом работает на вас?
nixda
1
@ nixda Нет. Это переписывает файл. Мне нужно заблокировать текущий файл, не меняя его.
болотное движение
Понимаю. Я убираю свой закрытый голос
nixda

Ответы:

45

Я думаю, что PowerShell, вероятно, самый лучший способ сделать это. Что-то вроде следующего:

#Specify the file name
$fileName = "C:\myfile.txt"

#Open the file in read only mode, without sharing (I.e., locked as requested)
$file = [System.io.File]::Open($fileName, 'Open', 'Read', 'None')

#Wait in the above (file locked) state until the user presses a key
Write-Host "Press any key to continue ..."
$null = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

#Close the file (This releases the current handle and unlocks the file)
$file.Close()

Во время паузы приведенный выше скрипт вызывает следующую подсказку при попытке открыть файл «myfile.txt»:

введите описание изображения здесь

Дэн
источник
2
Большой! Благодарность! К своему стыду, я должен признаться, что я развивался в powershell и не думал об использовании классов .net для этого. [Я надеюсь, что это не пойдет дальше :-)]
болотистое движение
1
Хороший ответ. Для любопытных, вот ссылка MSDN на File::Openметод, детализирующий параметры вызова (в частности, последний аргумент 'None', отклоняет совместное использование файла с любыми другими потоками / процессами - и аналогично, существуют положения, блокирующие файл только для чтения / записи. или их комбинация).
Прорыв
1
@moab Файл закрывается и дескриптор освобождается в конце.
Дэн,
2
Обратите внимание, что $host.UI.RawUI.ReadKey(...)в PowerShell ISE произойдет сбой, поскольку ReadKey не реализован для ISE. Обходной путь есть [void](Read-Host 'Press Enter to continue'). Не совсем так, как пользователь должен нажать Enter, а не любую клавишу. Тем не менее, достаточно для большинства целей. Обходной путь был получен
SimonTewsi
4

Так как я не люблю устанавливать программное обеспечение, которое на самом деле не буду использовать, я нашел этот драгоценный камень VBScript:

Const ForAppending = 8
Set oFSO = CreateObject("Scripting.FileSystemObject")

Set f = oFSO.OpenTextFile("C:\Tst\My2.txt", ForAppending, True)

MsgBox "Press OK to unlock the file(s)"

Весь кредит переходит к Торгейру Баккену, вы можете увидеть полный пост здесь: http://www.pcreview.co.uk/threads/how-to-lock-files.1518829/

Эрикс Окаковскис
источник
Прекрасно для тех, кто не любит PowerShell, как решение выше
болтать
0

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

Команда attrib.exe доступна в командной строке и позволит вам установить файл или каталог только для чтения. Более подробную информацию об этой команде можно найти здесь

И наоборот, вы можете сделать то же самое с помощью графического интерфейса, щелкнув правой кнопкой мыши файл или каталог, который вы хотите пометить только для чтения, выбрав свойства и отметив флажок «Только чтение». Нажмите Apply / Ok, чтобы применить новый параметр к файлу или каталогу.

Дерек Вирх
источник
3
Атрибут только для чтения предотвращает только изменения, но не удаления.
ComFreek
0

Разве невозможно ограничить доступ к файлу с помощью вкладки «Безопасность», если щелкнуть правой кнопкой мыши и перейти в «Свойства» для файла или папки?

Если у пользователя есть доступ администратора к ПК, то не позволит ли он удалить все остальные возможности что-либо делать с файлом / папкой?

При вводе текста я должен признать, что мой рабочий компьютер все еще работает на WinXP Pro, поэтому то, что я изложил выше, может быть недоступно больше - мне все еще не так комфортно с моей новой коробкой Win 8.1 Pro дома, как с годы работы с Win XP

Boots66
источник
Ни одно из доступных разрешений NTFS не имитирует поведение заблокированного файла. Самым близким было бы сделать файл доступным только для чтения, но мы можем быть уверены, что OP знает об этой опции и спрашивает о блокировке файла по уважительной причине.
Я говорю «Восстановить Монику»
-2

В некоторых случаях создание новой папки с именем файла может помочь. (Т.е. появляется ошибка при попытке открыть файл).

noonex
источник
Это действительно комментарий, а не ответ на оригинальный вопрос.
DavidPostill
Для меня это был ответ в задании, которое привело меня на эту страницу. Из-за таких людей, как вы, кто-то не найдет этого в подобной задаче
noonex
3
ОП спрашивал, как заблокировать существующий файл . Создание папки с тем же именем невозможно. «Подкаталог или файл xxx уже существует», поэтому ваш ответ не относится к проблеме в вопросе.
DavidPostill
Во многих случаях необходимо «заблокировать существующий файл», чтобы приложение получило ошибку при попытке изменить или открыть его. Я действительно перестану объяснять очевидные вещи сейчас - хорошего дня, сэр.
noonex