2010-09-16 48 views
0

我在Windows 7上使用C#3.5。我们已经使用FileSystemWatcher实现了一个程序。在这里,不会引发重命名事件。但它正在一些系统上工作。Filesystemwatcher不会在Windows7的C#中引发重命名事件处理程序

这可能是什么原因造成的?

+0

你是如何试图提高改名事件?顺便说一句C#3.5不存在。 – recursive 2010-09-16 14:58:19

+4

嗨,我注意到你没有接受一个单一的答案给你堆栈溢出,在你的10个问题中...只是一个想法,这是关于这里的社区... :) – TimS 2010-09-16 14:59:29

+0

@klausbyskov - 是的但... Windows的这个特定领域因不可靠而臭名昭着。我同意首先查找错误,但可能没有100%的解决方案。 – 2010-09-16 15:03:47

回答

2

您的代码中可能有一个时间窗口,因此并非所有文件系统事件都能在您的所有系统上正确捕获。你可以发布吗?

这是底层的Win32 API ReadDirectoryChangesW的一个'特性',因此FileSystemWatcher在重负载下可能会错过事件。 MSDN docs有缓解建议。

1

请确保您设置您的守望者:

fileSystemWatcher.EnableRaisingEvents = true; 
+4

如果没有设置,它根本无法工作。 – ygoe 2015-07-04 09:07:45

1
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Globalization; 
using System.IO; 
using System.Linq; 
using System.Security.AccessControl; 
using System.Security.Permissions; 
using System.Text; 
using System.Windows.Forms; 

namespace Watcher 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      FileRenamed();   
     } 

     private static string _osLanguage = null; 
     [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 

     private void FileRenamed() 
     { 
      MessageBox.Show("Code is Started Now"); 
      // Create a new FileSystemWatcher and set its properties. 
      FileSystemWatcher watcher = new FileSystemWatcher(); 

      SetDirectoryAccess(@"c:\temp"); 

      watcher.Path = @"C:\Temp"; 

      /* Watch for changes in LastAccess and LastWrite times, and 
       the renaming of files or directories. */ 
      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
       | NotifyFilters.FileName | NotifyFilters.DirectoryName; 

      // Only watch text files. 
      watcher.Filter = "*.txt"; 

      // Add event handlers. 
      watcher.Changed += new FileSystemEventHandler(OnChanged); 
      watcher.Created += new FileSystemEventHandler(OnChanged); 
      watcher.Deleted += new FileSystemEventHandler(OnChanged); 
      watcher.Renamed += new RenamedEventHandler(OnRenamed); 
      watcher.Error += new ErrorEventHandler(OnError); 

      // Begin watching. 
      watcher.EnableRaisingEvents = true; 

     } 

     // Define the event handlers. 
     private static void OnChanged(object source, FileSystemEventArgs e) 
     { 
      // Specify what is done when a file is changed, created, or deleted. 
      //Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); 
      MessageBox.Show("Something is changed in the File"); 
     } 

     private static void OnRenamed(object source, RenamedEventArgs e) 
     { 
      // Specify what is done when a file is renamed. 
      MessageBox.Show("File Is Renamed"); 
      //WatcherChangeTypes wct = e.ChangeType; 
      //Console.WriteLine("File {0} {2} to {1}", e.OldFullPath, e.FullPath, wct.ToString()); 
     } 


     // This method is called when the FileSystemWatcher detects an error. 
     private static void OnError(object source, ErrorEventArgs e) 
     { 
      MessageBox.Show("Error Trapped"); 
      // Show that an error has been detected. 
      Console.WriteLine("The FileSystemWatcher has detected an error"); 
      // Give more information if the error is due to an internal buffer overflow. 
      if (e.GetException().GetType() == typeof(InternalBufferOverflowException)) 
      { 
       // This can happen if Windows is reporting many file system events quickly 
       // and internal buffer of the FileSystemWatcher is not large enough to handle this 
       // rate of events. The InternalBufferOverflowException error informs the application 
       // that some of the file system events are being lost. 
       Console.WriteLine(("The file system watcher experienced an internal buffer overflow: " + e.GetException().Message)); 
      } 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      //File.Move(@"\\NAS\dossier_echange\Carl\temp\Test.txt", @"\\NAS\dossier_echange\Carl\temp\Test007.txt"); 
      File.Move(@"c:\temp\Test.txt", @"c:\temp\Test007.txt"); 
     } 

     internal static void SetDirectoryAccess(string directoryPathString) 
     { 
      string everyoneString; 

      if (OSLanguage.Equals("en-US")) 
       everyoneString = "Everyone"; 
      else 
       everyoneString = "Tout le monde"; 

      //sets the directory access permissions for everyone 
      DirectorySecurity fileSecurity = Directory.GetAccessControl(directoryPathString); 
      //creates the access rule for directory 
      fileSecurity.ResetAccessRule(new FileSystemAccessRule(everyoneString, FileSystemRights.FullControl, AccessControlType.Allow)); 
      //sets the access rules for directory 
      Directory.SetAccessControl(directoryPathString, fileSecurity); 
     } 

     public static string OSLanguage 
     { 
      get 
      { 
       if (_osLanguage == null) 
        _osLanguage = CultureInfo.CurrentCulture.Name; 

       return _osLanguage; 
      } 
      set 
      { 
       _osLanguage = value; 
      } 
     } 
    } 
} 
相关问题