2012-11-16 22 views
5

Spędziłem sporo czasu zastanawiając się, jak to zrobić, ale nie znalazłem żadnego przydatnego rozwiązania.Jak ręcznie Zablokować plik dla innych aplikacji

Oto, co chcę zrobić. Generuję ogromny plik binarny w mojej aplikacji. Trudne jest to, że proces ten wymaga od mnie zamknięcia okna FileStream. Problem polega na tym, że czasami inne aplikacje (np. Mój skaner antywirusowy) używają tego krótkiego momentu, w którym plik nie jest już zablokowany, aby zablokować sam plik. lub inne aplikacje, takie jak Dropbox itp.

Powoduje to, że następnym razem, gdy trzeba otworzyć strumień plików, oznacza to, że jest zablokowany przez inny proces. Wszystko to zdarza się bardzo rzadko, ale w dalszym ciągu jest denerwujące. I nawet jeśli nadal otrzymuję dostęp do pliku, nadal nie chcę, aby np. Dropbox przesyłał ten plik do momentu jego zakończenia (co może potrwać kilka minut).

Potrzebna jest możliwość ręcznego zablokowania pliku, aby moja aplikacja mogła nadal otwierać strumienie plików w tym pliku, ale żadna inna aplikacja nie może działać, dopóki nie odblokuję go ręcznie.

Wyobrażam coś takiego w Pseudokod:

File.Lock(filepath); 

//... do something that opens and closes filestreams on this file 

File.Unlock(filepath); 

Czy istnieje sposób to zrobić? Rozwiązanie "utrzymuj otwarty strumień plików" jest nieprawidłowe. Dokładnie staram się tego uniknąć, więc miej to na uwadze.

+0

zmodyfikowałem swój kod, aby być bardziej jasne, co oczekujesz. –

+2

Jednym słowem: 'IsolatedStorageFile' – avishayp

+0

Czy możesz zmienić go na plik RO, a następnie zmienić go z powrotem na RW w celu edycji? – Paparazzi

Odpowiedz

7

Jak sam zauważyłeś, najlepszym sposobem na zablokowanie pliku jest otwarcie jego uchwytu za pomocą FileStream. Główny plik FileStream zostaje zamknięty, mówisz, ale możesz symulować blokadę za pomocą jednego. Oto klasa próbki, przy użyciu IDisposable tak, że sam obiekt FileLock jest blokada i usuwania go uwalnia go:

public class FileLock : IDisposable 
{ 
    private FileStream _lock; 
    public FileLock(string path) 
    { 
     if (File.Exists(path)) 
     { 
      _lock = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None); 
      IsLocked = true; 
     }    
    } 

    public bool IsLocked { get; set; } 

    public void Dispose() 
    { 
     if (_lock != null) 
     { 
      _lock.Dispose(); 
     } 
    } 
} 

i użytkowania:

using (FileLock lock = new FileLock(filePath)) 
{ 
     // Safe in the knowledge that the file is out of harm's way. 
} 
Powiązane problemy