2013-04-29 42 views
18

Vì một lý do nào đó, số FileSystemWatcher của tôi không kích hoạt bất kỳ sự kiện nào. Tôi muốn biết bất cứ lúc nào một tập tin mới được tạo ra, xóa hoặc đổi tên trong thư mục của tôi. _myFolderPath đang được đặt chính xác, tôi đã kiểm tra.FileSystemWatcher không kích hoạt sự kiện

Đây là mã hiện tại của tôi:

public void Setup() { 
    var fileSystemWatcher = new FileSystemWatcher(_myFolderPath); 
    fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess | 
     NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; 

    fileSystemWatcher.Changed += FileSystemWatcherChanged; 
    fileSystemWatcher.Created += FileSystemWatcherChanged; 
    fileSystemWatcher.Deleted += FileSystemWatcherChanged; 
    fileSystemWatcher.Renamed += FileSystemWatcherChanged; 

    fileSystemWatcher.Filter = "*.*"; 
    fileSystemWatcher.EnableRaisingEvents = true; 
} 

private void FileSystemWatcherChanged(object sender, FileSystemEventArgs e) 
{ 
    MessageBox.Show("Queue changed"); 
    listBoxQueuedForms.Items.Clear(); 
    foreach (var fileInfo in Directory.GetFiles(_myFolderPath, "*.*", SearchOption.TopDirectoryOnly)) 
    { 
     listBoxQueuedForms.Items.Add(fileInfo)); 
    } 
} 
+0

bạn đã làm gì để xác minh rằng một tình huống xảy ra trong đó những sự kiện đó nên sa thải? – tnw

+0

Tôi đã tạo, đổi tên và xóa các tệp theo cách thủ công trong thư mục của mình. Không có gì cháy. – gwin003

+0

Ổ đĩa cục bộ, thư mục AppData/Roaming của nó cụ thể hơn – gwin003

Trả lời

16

Bạn dường như được tạo ra FileSystemWatcher như là một biến địa phương trong phương pháp thiết lập. Điều này tất nhiên sẽ đi ra khỏi phạm vi ở phần cuối của phương pháp và cũng có thể được nhận dọn dẹp tại thời điểm đó, do đó loại bỏ các đồng hồ.

Hãy thử tạo FSW tại thời điểm nó sẽ được lưu lại (ví dụ: biến cấp chương trình) và xem liệu bạn có sắp xếp không.

+0

Tôi đã chuyển 'FileSystemWatcher' thành biến cục bộ riêng tư và dường như nó hoạt động ổn định hơn bây giờ. – gwin003

+0

@ gwin003 Nó _was_ biến cục bộ.Tôi nghi ngờ bạn có nghĩa là bạn chuyển nó vào một _field_ riêng? –

+0

Rất tiếc, vâng đó là điều tôi muốn nói haha. Nó sẽ không cho phép tôi chỉnh sửa bình luận của tôi ngay bây giờ vì lý do nào đó ... – gwin003

17

Vấn đề của tôi là tôi đã mong đợi một số hành động nhất định gây ra đám cháy sự kiện FileSystemWatcherChanged. Ví dụ: di chuyển tệp (nhấp và kéo) từ màn hình sang vị trí đã xem không tăng sự kiện nhưng sao chép tệp hiện có và dán một bản sao mới (bằng cách tạo tệp mới vào hệ thống tệp và không chỉ đơn giản là di chuyển một cái hiện có) đã gây ra sự kiện Changed.

Giải pháp của tôi là thêm mỗi NotifyFilter vào số FileSystemWatcher của tôi. Bằng cách này, tôi được thông báo trong mọi trường hợp trong đó FileSystemWatcher có thể thông báo cho tôi.

LƯU Ý rằng nó không hoàn toàn trực quan/hiển nhiên là bộ lọc nào sẽ thông báo cho bạn về các trường hợp cụ thể. Ví dụ, tôi hy vọng rằng nếu tôi bao gồm FileName rằng tôi sẽ được thông báo về bất kỳ thay đổi nào đối với tên tệp hiện có ... thay vào đó, Attributes dường như xử lý trường hợp đó.

watcher.NotifyFilter = NotifyFilters.Attributes | 
    NotifyFilters.CreationTime | 
    NotifyFilters.FileName | 
    NotifyFilters.LastAccess | 
    NotifyFilters.LastWrite | 
    NotifyFilters.Size | 
    NotifyFilters.Security; 
-1

Chúng tôi vừa gặp sự cố tương tự, khi di chuyển thư mục không kích hoạt các sự kiện được mong đợi. Giải pháp là sao chép toàn bộ thư mục cứng, thay vì chỉ di chuyển nó.

DirectoryCopy(".", ".\\temp", True) 

Private Shared Sub DirectoryCopy(_ 
     ByVal sourceDirName As String, _ 
     ByVal destDirName As String, _ 
     ByVal copySubDirs As Boolean) 

     ' Get the subdirectories for the specified directory. 
     Dim dir As DirectoryInfo = New DirectoryInfo(sourceDirName) 

     If Not dir.Exists Then 
      Throw New DirectoryNotFoundException(_ 
       "Source directory does not exist or could not be found: " _ 
       + sourceDirName) 
     End If 

     Dim dirs As DirectoryInfo() = dir.GetDirectories() 
     ' If the destination directory doesn't exist, create it. 
     If Not Directory.Exists(destDirName) Then 
      Directory.CreateDirectory(destDirName) 
     End If 
     ' Get the files in the directory and copy them to the new location. 
     Dim files As FileInfo() = dir.GetFiles() 
     For Each file In files 
      Dim temppath As String = Path.Combine(destDirName, file.Name) 
      file.CopyTo(temppath, False) 
     Next file 

     ' If copying subdirectories, copy them and their contents to new location. 
     If copySubDirs Then 
      For Each subdir In dirs 
       Dim temppath As String = Path.Combine(destDirName, subdir.Name) 
       DirectoryCopy(subdir.FullName, temppath, true) 
      Next subdir 
     End If 
    End Sub 
+0

câu hỏi là trong C# không vb –

3

Sử dụng setter này để kích hoạt cò:

watcher.EnableRaisingEvents = true; 
+1

Oh my, cảm ơn rất nhiều vì điều đó . Ngạc nhiên với tôi rằng một lá cờ là cần thiết cho các sự kiện. – David

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