2012-11-16 28 views
5

Tôi đã dành khá nhiều thời gian để tìm ra cách thực hiện điều này nhưng không tìm thấy bất kỳ giải pháp hữu ích nào.Cách khóa thủ công tệp cho các ứng dụng khác

Đây là những gì tôi muốn làm. Tôi đang tạo một tệp nhị phân khổng lồ trong ứng dụng của mình. Điều phức tạp là, quá trình yêu cầu tôi thỉnh thoảng đóng FileStream. Vấn đề bây giờ là, thỉnh thoảng các ứng dụng khác (tức là máy quét vi-rút của tôi) đang sử dụng thời điểm ngắn gọn này nơi tệp không bị khóa nữa, để khóa chính tệp đó. hoặc các ứng dụng khác như dropbox, v.v ...

Kết quả là, lần sau tôi cần mở luồng tệp, nó nói rằng nó bị khóa bởi một quy trình khác. Tất cả điều này chỉ xảy ra rất hiếm khi nhưng nó vẫn còn gây phiền nhiễu khi nó xảy ra. Và ngay cả khi tôi vẫn nhận được quyền truy cập tệp, tôi vẫn không muốn tài khoản dropbox tải tệp này lên cho đến khi hoàn tất (có thể mất vài phút).

Điều tôi cần là khả năng khóa tệp theo cách thủ công để ứng dụng của tôi vẫn có thể mở luồng tệp trên tệp này, nhưng không có ứng dụng nào khác có thể cho đến khi tôi mở lại thủ công.

Tôi hình dung một cái gì đó như thế này trong giả:

File.Lock(filepath); 

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

File.Unlock(filepath); 

Có cách nào để làm điều này? Giải pháp "giữ cho luồng tệp mở" không hợp lệ. Tôi cố gắng tránh điều đó vì vậy hãy ghi nhớ điều đó.

+0

tôi sửa mã của bạn để được rõ ràng hơn những gì bạn đang mong đợi. –

+2

Trong một từ: 'IsolatedStorageFile' – avishayp

+0

Bạn có thể thay đổi nó thành tệp RO sau đó đổi lại thành RW để chỉnh sửa không? – Paparazzi

Trả lời

7

Khi bạn nhận thấy chính mình, cách tốt nhất để khóa tệp là mở một tay cầm cho nó bằng cách sử dụng FileStream. FileStream chính của bạn bị đóng, bạn nói, nhưng bạn có thể mô phỏng một khóa bằng cách sử dụng một. Dưới đây là một lớp học mẫu, sử dụng IDisposable để các đối tượng FileLock chính nó là khóa, và xử lý nó giải phóng nó:

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

Và sử dụng:

using (FileLock lock = new FileLock(filePath)) 
{ 
     // Safe in the knowledge that the file is out of harm's way. 
} 
Các vấn đề liên quan