2011-02-28 115 views
0

我一直在监视网络目录中的文件。我最初使用FileWatcher来监视它们。我发现这些文件在使用FileWatcher时被锁定,因此我将我的实现更改为使用DirectoryInfo来监视我正在观看的目录中新到达和删除的文件。看来在使用DirectoryInfo的同时,监视目录中的文件也会被锁定,从而防止文件在下载文件后被另一个应用程序删除。我的手表应用程序是一个Windows服务。监视目录中的文件在使用DirectoryInfo时被锁定

有谁能告诉我他们是否面临问题,如果他们有,你是如何解决它?

谢谢,

+1

“我发现该文件已在使用FileWatcher被锁定” - 似乎不大可能.... – 2011-02-28 05:17:32

+0

你处理文件,同时通过filewatcher监控。您需要在应用程序中优雅地关闭文件句柄。 – 2011-02-28 05:49:12

+0

发布您的代码 - 当您有新文件时,您会做什么? – VinayC 2011-02-28 06:00:38

回答

1

你确定无论是创建/更新文件完成吗?如果没有,该文件将被锁定。

+0

有一个进程A生成2个文件(一个大小为1KB;另一个大小为67MB),并将其放入一个n/w文件夹中。这些文件被下载并在4到5小时后被另一个进程B删除。我的应用程序执行的操作是,从文件到达之前检查文件夹,直到文件被删除,并且文件被删除时,应用程序发出通知,指出文件已被删除。我发现过程B能够下载和删除较小尺寸的文件,但较大的文件始终存在删除问题。我没有处理任何文件。 – Researcher 2011-02-28 07:11:28

0

即使FileWatcher应该在UNC上工作,我也遇到了很多问题。由于你的问题不是时间关键的,我会创建一个线程来检查文件是否存在,睡眠几秒钟循环,直到发送警报的文件消失。

注意:作为服务运行需要正在运行的用户对远程共享拥有网络权限。

更新:刚在我们的网络上做了一个快速测试。运行Windows 7 R2服务器的客户端运行Windows 2008 R2。增加了几个文件,无论是小型还是大型文件。在代码运行时删除文件没有任何问题。即使没有了Thread.Sleep

 bool filesDeleted = false; 

     while (!filesDeleted) 
     { 
      DirectoryInfo di = new DirectoryInfo(@"\\server\share\path\"); 
      FileInfo[] files = di.GetFiles(); 

      foreach (var file in files) 
      { 
       DateTime created = file.CreationTime; 
       string fileName = file.Name; 

       //Do what every you need to check if the two files are still there 
      } 

      Thread.Sleep(5000); 
     } 

     //Send alert 
+0

这就是应用程序运行的方式。检查文件,睡觉,再次检查文件。 Windows服务具有网络权限,我能够成功找出其中一个文件已被删除。但是,删除文件的应用程序无法删除2个文件中较大的一个。在观察器应用程序运行时,似乎在文件上放置了一些锁。在监视目录上是否有“finfFileList = DirectoryInfo.getFiles()”,随后可以通过后续访问“finfFileList.creationtime”来锁定我正在观看的文件? – Researcher 2011-02-28 07:56:00

+0

对不起。我虽然使用了FileSystemWather类。我不认为它不应该对它们加锁,但索引服务或防病毒可能会扫描这些文件。删除大型ISO映像文件时遇到过类似的问题。在我的情况下删除文件夹(高级属性)上的“允许文件和文件夹进行索引”属性修复它。 – Paaland 2011-02-28 08:02:25

+0

当观察者应用程序未运行时,可以下载和删除这些文件。只有当监视器应用程序运行并监视目录时,才会显示锁被放置在文件上,并且文件不能被下载文件的应用程序删除,我们必须在以后实际手动从文件夹中手动删除文件。 – Researcher 2011-02-28 08:39:38