2010-02-08 11 views
5

Potrzebuję usunąć plik. Czasami plik może być zablokowany, w tym przypadku chcę go odblokować i usunąć mimo to.Jak skutecznie odblokować plik wC#?

Do tej pory natknąłem się na dwie możliwości badań.

System.IO.FileStream.Unlock

i

//unlock file 
[DllImport("kernel32.dll", SetLastError = true)] 
internal static extern bool UnlockFile(IntPtr handle, int offsetLow, int offsetHi);` 

Czy któryś z tych dwóch metod pracy? Jeśli tak, czy mógłbyś podać próbkę, ponieważ nie otrzymałem żadnego z nich do skutku? Czy jest jeszcze inny lepszy sposób?

Odpowiedz

0

Zakończone przy użyciu narzędzia PSTools, wydaje się działać dobrze.

2

Powinieneś użyć opóźnionych operacji na plikach, zobacz How To Move Files That Are Currently in Use ("Przenieś" dołączone usuwanie w tym kontekście).

UnlockFile i przyjaciele są dla regionu operacji blokowania plików, nie dla plików blokowania uchwytu, patrz Locking and Unlocking Byte Ranges in Files. Hopefuly nie ma API odblokować zablokowany uchwyt pliku, która uczyniłaby blokowania dość dużo useles ...

+2

Blokada plików systemu Windows jest bezużyteczna - jest tak zapluskwiona, że ​​nieczytelne zamki pozostają na miejscu przez cały czas. – earcam

0

mogłeś spróbować dokonać P/Invoke wezwanie do MoveFileEx i MOVEFILE_DELAY_UNTIL_REBOOT:

Układ nie przenosi pliku, dopóki system operacyjny nie zostanie ponownie uruchomiony. System przenosi plik bezpośrednio po wykonaniu AUTOCHK, ale przed utworzeniem jakichkolwiek plików stronicowania. W związku z tym parametr ten umożliwia funkcję usuwania plików stronicowania z poprzednich uruchomień.

1

Sprawdziłem wywołanie System.IO.FileStream.Unlock() w Reflectorze RedGatesa i wydaje się, że po prostu wywołujemy wywołanie zewnętrzne UnlockFile(). Metody są jednym w tym samym.

Nasza obecna strategia polega na opóźnieniu, gdy mamy uzasadnione oczekiwania, że ​​plik zostanie odblokowany, w przeciwnym razie pomylimy się.

+0

Nie zrozumiałem, co masz na myśli ... –