2012-11-16 20 views
5

Bunun nasıl yapılacağını anladığım kadar uzun bir zaman harcadım, ancak herhangi bir yararlı çözüm bulamadı.Diğer uygulamalar için bir dosyayı manuel olarak kilitleme

İşte yapmak istediklerim budur. Uygulamamda büyük bir ikili dosya oluşturuyorum. Zor olan şey, sürecin ara sıra FileStream'i kapatmamı gerektirmesi. Şimdi sorun şu ki, bazen diğer uygulamalar (yani virüs tarayıcım) dosyanın kilitlenmediği bu kısa anı kullanıyor, dosyayı kilitlemek için. veya dropbox gibi diğer uygulamalar ...

Sonuç olarak, bir dahaki sefere dosya akışını açmam gerekiyor, başka bir işlem tarafından kilitlendiğini söylüyor. Tüm bunlar sadece çok nadiren olur, ancak gerçekleştiğinde hala can sıkıcıdır. Ve yine de dosyaya erişebiliyor olsam bile, bu dosyayı yüklemeden önce (yani birkaç dakika sürebilir) dropbox istemiyorum.

İhtiyacım olan şey, bir dosyayı el ile kilitleme olanağıdır, böylece uygulamam bu dosyada hala dosya akışını açabilir, ancak el ile yeniden açana kadar başka bir uygulama yapılamaz.

File.Lock(filepath); 

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

File.Unlock(filepath); 

bunu yapmanın bir yolu var mı:

ben pseudocode böyle bir şey hayal? "Dosya akışını açık tut" çözümü geçerli değil. Ben açıkça bundan kaçınmaya çalışıyorum, lütfen bunu aklınızda bulundurun.

+0

Daha açık olmak üzere kodunuzu düzenlenmiş neyi bekliyorsun. –

+2

Tek kelimeyle: "IsolatedStorageFile" – avishayp

+0

Bir RO dosyasına değiştirebilir ve daha sonra düzenlemek için tekrar RW olarak değiştirebilir misiniz? – Paparazzi

cevap

7

Kendinizi fark ettiğiniz gibi, bir dosyayı kilitlemenin en iyi yolu, bir FileStream kullanarak bir tanıtıcı açmaktır. Ana FileStream'iniz kapalı olur, diyorsunuz, ancak birini kullanarak bir kilit simülasyonu yapabilirsiniz. Aşağıda örnek bir sınıf IDisposable kullanarak, var FileLock nesne kendisi kilit olduğunu ve bunu bertaraf serbest bırakmadığı böylece:

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(); 
     } 
    } 
} 

Ve kullanımını:

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