2008-08-23 30 views
7

Trong C# tôi có thể sử dụng đối tượng FileSystemWatcher để xem một tệp cụ thể và tăng sự kiện khi nó được tạo, sửa đổi, v.v.Có thể nâng cao sự kiện khi một tập tin có thể truy cập được không?

Vấn đề tôi có với lớp này là nó tăng sự kiện vào thời điểm tệp sẽ được tạo, ngay cả khi quá trình tạo tệp vẫn còn trong quá trình viết. Tôi thấy vấn đề này rất có vấn đề, đặc biệt là nếu tôi đang cố gắng đọc một thứ gì đó giống như một tài liệu XML, nơi tệp phải có một số cấu trúc cho nó, nó sẽ không tồn tại cho đến khi nó được hoàn thành bằng văn bản.

.NET (tốt nhất là 2.0) có bất kỳ cách nào để tăng sự kiện sau khi tệp có thể truy cập được không, hoặc tôi có phải thử đọc tệp liên tục cho đến khi nó không ném ngoại lệ để biết nó có sẵn không?

Trả lời

0

Không chắc chắn nếu có một cách của một sự kiện thực sự được nâng lên bởi các lớp tiêu chuẩn, nhưng tôi eas gặp vấn đề tương tự trên một số công việc gần đây tôi đã làm.

Tóm lại, tôi đã cố ghi vào một tệp đã bị khóa vào lúc đó. Tôi đã kết thúc gói phương pháp ghi lên để nó sẽ tự động thử viết lại sau vài giây sau khi ..

Suy nghĩ to, Bạn có thể thăm dò tệp cho trạng thái ReadOnly không? Có thể có giá trị sau đó có một wrapper cho tập tin IO có thể chồng lên đại biểu cho các hoạt động tập tin đang chờ giải quyết hoặc một cái gì đó .. Suy nghĩ?

0

Sử dụng CreateFile trong một vòng lặp với OPEN_ HIỆN cờ và FILE_ ALL_ ACCESS (hoặc bạn có thể chỉ cần một tập hợp con, xem http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx

Kiểm tra xử lý trở lại -1 (INVALID_ HANDLE_ GIÁ TRỊ) cho thất bại. Nó vẫn bỏ phiếu , nhưng điều này sẽ tiết kiệm được chi phí của một ném ngoại lệ

EDIT:. trình soạn thảo này/đánh dấu không thể xử lý dấu gạch bah

5

Bạn có thể sử dụng một watcher hệ thống tập tin để kiểm tra khi tập tin đã được thay đổi!. Nó chỉ trở thành "thay đổi" sau khi chương trình nào có tệp trước đó đóng fi le. Tôi biết bạn đã yêu cầu C#, nhưng VB.Net của tôi là tốt hơn nhiều. Hy vọng bạn hoặc người khác có thể dịch.

Nó cố gắng mở tệp, nếu nó không khả dụng, nó sẽ thêm người theo dõi và chờ tệp thay đổi. Sau khi tập tin được thay đổi, nó sẽ cố mở lại. Nó ném một ngoại lệ nếu nó chờ đợi hơn 120 giây, bởi vì bạn có thể bị bắt trong một tình huống mà tập tin không bao giờ được phát hành. Ngoài ra, tôi quyết định thêm một thời gian chờ đợi cho sự thay đổi tập tin của 5 giây, trong trường hợp khả năng nhỏ mà tập tin đã được đóng trước khi người xem tập tin thực tế được tạo ra.

Public Sub WriteToFile(ByVal FilePath As String, ByVal FileName As String, ByVal Data() As Byte) 
     Dim FileOpen As Boolean 
     Dim File As System.IO.FileStream = Nothing 
     Dim StartTime As DateTime 
     Dim MaxWaitSeconds As Integer = 120 

     StartTime = DateTime.Now 

     FileOpen = False 

     Do 
      Try 
       File = New System.IO.FileStream(FilePath & FileName, IO.FileMode.Append) 
       FileOpen = True 

      Catch ex As Exception 

       If DateTime.Now.Subtract(StartTime).TotalSeconds > MaxWaitSeconds Then 
        Throw New Exception("Waited more than " & MaxWaitSeconds & " To Open File.") 
       Else 
        Dim FileWatch As System.IO.FileSystemWatcher 

        FileWatch = New System.IO.FileSystemWatcher(FilePath, FileName) 
        FileWatch.WaitForChanged(IO.WatcherChangeTypes.Changed,5000) 
       End If 

       FileOpen = False 

      End Try 

     Loop While Not FileOpen 

     If FileOpen Then 
      File.Write(Data, 0, Data.Length) 
      File.Close() 
     End If 
    End Sub 
0

Câu trả lời của Kibbe có vẻ đúng nhưng không hiệu quả đối với tôi. Dường như FileSystemWatcher có lỗi. Vì vậy, tôi đã viết WaitForChanged của riêng mình:

using (var watcher = new FileSystemWatcher(MatlabPath, fileName)) 
{ 
    var wait = new EventWaitHandle(false, EventResetMode.AutoReset); 
    watcher.EnableRaisingEvents = true; 
    watcher.Changed += delegate(object sender, FileSystemEventArgs e) 
    { 
     wait.Set(); 
    }; 
    if (!wait.WaitOne(MillissecondsTimeout)) 
    { 
     throw new TimeoutException(); 
    } 
} 
+0

Vui lòng báo cáo lỗi này cho Microsoft tại http://connect.microsoft.com/visualstudio. –

+0

[John Aldrige] (http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic56372.aspx) đã thực hiện [it] (https://connect.microsoft.com/VisualStudio/feedback/ ViewFeedback.aspx? FeedbackID = 240502) –

+0

@JaderDias Liên kết kết nối bị hỏng –

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