2010-04-23 25 views
5

Tôi đã cố khóa một tệp để các dịch vụ nhân bản khác không thể truy cập tệp. Sau đó tôi đọc tệp, rồi di chuyển tệp khi hoàn tất. Di chuyển được cho phép bằng cách sử dụng FileShare.Delete.Hành vi khóa khác với mạng chia sẻ

Tuy nhiên trong thử nghiệm sau này, chúng tôi nhận thấy rằng phương pháp này không hoạt động nếu chúng ta đang xem xét chia sẻ mạng. Tôi đánh giá cao cách tiếp cận của tôi có thể không phải là tốt nhất, nhưng câu hỏi cụ thể của tôi là:

Tại sao bản trình diễn bên dưới hoạt động với tệp cục bộ chứ không phải chống lại tệp mạng?

Cụ thể hơn, bạn có thể trở nên tốt hơn, vì tôi đã tìm thấy rất ít thông tin trong các tìm kiếm cho biết chia sẻ mạng hoạt động khác với các ổ đĩa cục bộ.

string sourceFile = @"C:\TestFile.txt"; 
string localPath = @"C:\MyLocalFolder\TestFile.txt"; 
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt"; 

File.WriteAllText(sourceFile, "Test data"); 

if (!File.Exists(localPath)) 
    File.Copy(sourceFile, localPath); 

foreach (string path in new string[] { localPath, networkPath }) 
{ 
    using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete))) 
    { 
     string target = path + ".out"; 
     File.Move(path, target); //This is the point of failure, when working with networkPath 

     if (File.Exists(target)) 
      File.Delete(target); 
    } 

    if (!File.Exists(path)) 
     File.Copy(sourceFile, path); 
} 

EDIT: Cần lưu ý rằng nếu bạn muốn di chuyển tệp từ một chia sẻ mạng, sang một mạng khác trong khi khóa được bật, tính năng này hoạt động. Sự cố chỉ xảy ra khi di chuyển một tệp trong phạm vi cùng một chia sẻ tệp trong khi tệp bị khóa.

+0

Kiểm tra xem bạn có quyền ghi vào thư mục được chia sẻ hay không. – Nayan

+0

Quyền đã được kiểm tra và không sao. Người dùng đang hoạt động có toàn quyền Kiểm soát trên thư mục và Chia sẻ – MattH

+0

Loại hệ điều hành nào cung cấp chia sẻ? –

Trả lời

3

Tôi tin rằng System.IO.File.Open() ánh xạ tới hàm API Win32 CreateFile(). Trong tài liệu của Microsoft cho chức năng này [http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx], nó đề cập đến những điều sau đây:

Windows Server 2003 và Windows XP/2000: Vi phạm chia sẻ xảy ra nếu một nỗ lực được thực hiện để mở một tập tin hoặc thư mục để xóa trên một xa máy tính khi giá trị của tham số dwDesiredAccess là cờ truy cập DELETE (0x00010000) OR'ed với bất kỳ cờ truy cập nào khác và tệp hoặc thư mục từ xa chưa được mở bằng FILE_SHARE_DELETE. Để tránh vi phạm chia sẻ trong trường hợp này, hãy mở tệp hoặc thư mục từ xa với quyền truy cập DELETE ngay, hoặc gọi DeleteFile mà không cần mở tệp hoặc thư mục để xóa.

Theo đó, bạn sẽ phải chuyển DELETE làm tham số FileAccess thành IO.File.Open(). Thật không may, việc liệt kê DELETE không được bao gồm như là một lựa chọn.

Sự cố này chỉ liên quan đến Windows 2003 trở về trước. Tôi đã thử nghiệm mã của bạn trên Windows 2008 R2 SP1 và nó hoạt động tốt. Vì vậy, nó có thể là nó cũng sẽ làm việc trên Windows 2008 là tốt.

+0

Cảm ơn Brian. Điều này có vẻ giống như một bản tóm tắt hợp lệ và giải thích những gì tôi đã nhìn thấy. – MattH

Các vấn đề liên quan