2010-04-09 14 views
7

Chciałbym wiedzieć, czy istnieje możliwość wyliczenia uchwytów plików w języku C#, być może przy użyciu interfejsu Win32API. Można to łatwo zrobić dla uchwytów okien i procesów, ale wydaje się, że nie jest możliwe uchwyty plików.Wyliczanie uchwytów plików w języku C#

Chociaż niektóre funkcje oferowane są przez NtQuerySystemInformation, jest to wycofywane i dlatego nie zaleca się stosowania takiej metody.

+0

możliwy duplikat http://stackoverflow.com/questions/231547/tracing-which-process-that-has-opened-i-particular-file –

Odpowiedz

7

No, wiesz, że to jest możliwe, narzędzie Rączka Sysinternals' robi. NtQueryInformation nie będzie wycofywane, jest niezbędnym interfejsem niskiego poziomu między Win32 a "prawdziwym" systemem operacyjnym.

Jednak nigdy nie zdarzy się, że argumenty NtQueryInformation, które pozwalają na obsługę uchwytów iteracyjnych, zostaną udokumentowane. Ponieważ nie kończy się ona właśnie tam, niektóre muppet użyje go do wywołania CloseHandle() na pliku, który nie chce być zablokowany. Które jest dobrym sposobem na zniszczenie zawartości dysku twardego.

Proces, w którym posiadano uchwyt, nie wie, że klamka jest zamknięta. Będzie po prostu dalej do niego pisać, prawdopodobnie całkowicie ignorując kod powrotu "nie działa" z WriteFile(). Co jest nieszkodliwe, dopóki program nie otworzy kolejnego uchwytu, odzyskując tę ​​samą wartość, co wcześniej zamknięta. Teraz zaczyna pisać mieszankę śmieci (przeznaczoną dla poprzedniego uchwytu) i nowe dane do uchwytu. Całkowicie niszcząc treść tego, do czego pisze. Nakręć taśmy kopii zapasowej, jeśli jest to coś w rodzaju bazy danych o znaczeniu krytycznym.

Powiązane problemy