Jak zablokować plik w systemie Windows bez jego zmiany lub korzystania z narzędzi innych firm?

24

Czy istnieje sposób na zablokowanie pliku za pomocą narzędzi pokładowych, aby nie można go było usunąć ani zastąpić?

Do testowania skryptów kopiujących muszę lock files temporarilysprawdzić obsługę błędów w skryptach. Do XP użyłem ładowania pliku do debug.exe, aby go zablokować.

Czy jest jakiś sposób w Windows 7 (i nowszych)?

Edytuj
Wiem, że robią to programy. Moje pytanie brzmi, czy w systemie Windows jest wbudowany mechanizm. Czasami muszę sprawdzić skrypt na komputerze i nie chcę instalować w tym celu nowych programów.

Edytuj2
Oto również dobre sugestie: Jak celowo wyłączać wyłącznie plik? , które jednak potrzebują narzędzi innych firm lub zmienią plik, który ma zostać zablokowany.

wiggle marsh
źródło
Czy sztuczka z notatnikiem działa dla Ciebie?
nixda
1
@nixda Nie. Nadpisuje plik. Muszę zablokować obecny plik bez jego zmiany.
marsh-wiggle
Widzę.
Cofam

Odpowiedzi:

45

Myślę, że PowerShell jest prawdopodobnie najładniejszym sposobem na osiągnięcie tego. Coś w stylu:

#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()

Po wstrzymaniu powyższy skrypt powoduje wyświetlenie następującego monitu podczas próby otwarcia pliku „mój_plik.txt”:

wprowadź opis zdjęcia tutaj

Dan
źródło
2
Świetny! Dzięki! Ku mojemu wstydowi muszę wyznać, że rozwijam się w programie PowerShell i nie myślałem o użyciu do tego klas .net. [Mam nadzieję, że to nie pójdzie dalej :-)]
wiggle marsh
1
Niezła odpowiedź. Dla ciekawskich, oto link MSDN do File::Openmetody wyszczególniającej parametry wywołania (konkretnie ostatni argument 'None', odmawia udostępnienia pliku innym wątkom / procesom - i podobnie istnieją przepisy blokujące plik tylko do odczytu / zapisu lub ich kombinacja).
Przełom
1
@moab Plik jest zamknięty, a uchwyt zwolniony na końcu.
Dan
2
Uwaga: $host.UI.RawUI.ReadKey(...)nie powiedzie się w programie PowerShell ISE, ponieważ ReadEey nie jest zaimplementowany dla ISE. Obejściem jest [void](Read-Host 'Press Enter to continue'). Niezupełnie to samo, co użytkownik musi nacisnąć klawisz Enter zamiast dowolnego klawisza. Jednak wystarcza do większości celów. Obejście tego problemu pochodzi z tego postu na blogu: jeffwouters.nl/index.php/2016/06/…
SimonTewsi
4

Ponieważ nie lubię instalować oprogramowania, którego tak naprawdę nie będę używać, znalazłem ten klejnot 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)"

Wszystkie podziękowania należą się Torgeir Bakken, pełny post można zobaczyć tutaj: http://www.pcreview.co.uk/threads/how-to-lock-files.1518829/

Eriks Ocakovskis
źródło
Przyjemny dla tych, którzy nie lubią PowerShell jak powyższe rozwiązanie
wiggle marsh-
0

Czy nie możesz oznaczyć go jako tylko do odczytu? To skutecznie „zablokuje” plik, uniemożliwiając jego zmianę lub usunięcie.

Polecenie attrib.exe jest dostępne w wierszu polecenia i pozwala ustawić plik lub katalog jako tylko do odczytu. Więcej informacji na temat tego polecenia można znaleźć tutaj

I odwrotnie, możesz zrobić to samo za pomocą GUI, klikając prawym przyciskiem myszy plik lub katalog, który chcesz oznaczyć jako tylko do odczytu, wybierając właściwości i zaznaczając pole Tylko do odczytu. Kliknięcie przycisku Zastosuj / Ok powoduje zastosowanie nowego ustawienia do pliku lub katalogu.

Derek Wirch
źródło
3
Atrybut tylko do odczytu zapobiega tylko modyfikacjom, ale nie usuwa.
ComFreek
0

Czy nie można ograniczyć dostępu do pliku za pomocą karty Zabezpieczenia, gdy klikniesz prawym przyciskiem myszy i przejdziesz do Właściwości pliku lub folderu?

Jeśli użytkownik ma dostęp administratora do komputera, to czy nie pozwoli mu to usunąć wszystkich innych możliwości robienia czegokolwiek z plikiem / folderem?

Muszę przyznać, że podczas pisania mój komputer stacjonarny nadal działa na WinXP Pro, więc to, co powiedziałem powyżej, może już nie być dostępne - nadal nie czuję się tak dobrze z moim nowym Win 8.1 Pro w domu, jak z lata pracy z Win XP

Buty66
źródło
Żadne z dostępnych uprawnień NTFS nie naśladuje zachowania zablokowanego pliku. Najbliższym byłoby uczynienie pliku tylko do odczytu, ale możemy być pewni, że OP jest świadomy tej opcji i prosi o zablokowanie pliku z dobrego powodu.
Mówię: Przywróć Monikę
-2

W niektórych scenariuszach utworzenie nowego folderu z nazwą pliku może wykonać zadanie. (Tzn. Wystąpił błąd podczas próby otwarcia pliku).

noonex
źródło
To jest naprawdę komentarz, a nie odpowiedź na pierwotne pytanie.
DavidPostill
Dla mnie była to odpowiedź w zadaniu, która doprowadziła mnie do tej strony. Z powodu ludzi takich jak ty ktoś nie znajdzie tego w podobnym zadaniu.
noonex
3
OP pytał, jak zablokować istniejący plik . Utworzenie folderu o tej samej nazwie nie jest możliwe. „Podkatalog lub plik xxx już istnieje”, więc Twoja odpowiedź nie dotyczy problemu w pytaniu.
DavidPostill
W wielu przypadkach potrzebna jest „blokada istniejącego pliku”, aby upewnić się, że aplikacja otrzyma błąd podczas próby modyfikacji lub otwarcia. Naprawdę przestanę teraz wyjaśniać oczywiste rzeczy - miłego dnia, proszę pana.
noonex