Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# filesystemwatcher是监视文件的正确方法吗?_C#_Filesystemwatcher - Fatal编程技术网

C# filesystemwatcher是监视文件的正确方法吗?

C# filesystemwatcher是监视文件的正确方法吗?,c#,filesystemwatcher,C#,Filesystemwatcher,我知道这是一个一般性的问题,但我只是开始讨论这个问题。我必须假设其他人也做过类似的事情,我不想做很多代码来发现我的解决方案不起作用 这是我的。用户会将一个文件作为OLE对象添加到数据库中,并将某种态度与该文件相关联的项目、版本等相关联。我使用的是Access–客户选择不是我的 当他们想要编辑它时,他们需要签出它。在这个阶段,我希望监视文件,并在保存文件时将其恢复到数据库中 我认为文件系统监视程序是我最好的方法——监视更改并在触发更改时将其保存回数据库,这样我就可以访问该文件。如果它仍然打开,应用

我知道这是一个一般性的问题,但我只是开始讨论这个问题。我必须假设其他人也做过类似的事情,我不想做很多代码来发现我的解决方案不起作用

这是我的。用户会将一个文件作为OLE对象添加到数据库中,并将某种态度与该文件相关联的项目、版本等相关联。我使用的是Access–客户选择不是我的

当他们想要编辑它时,他们需要签出它。在这个阶段,我希望监视文件,并在保存文件时将其恢复到数据库中

我认为文件系统监视程序是我最好的方法——监视更改并在触发更改时将其保存回数据库,这样我就可以访问该文件。如果它仍然打开,应用程序将锁定它,因此我知道用户还没有完成

所以,简而言之,我的问题是,文件系统监视程序是解决这个问题的正确方法吗?还有什么建议吗

谢谢,
Jim

要监视单个文件还是目录

FileSystemWatcher的设计目的是按照您的指示监视目录

因此,为了监视单个文件,可以使用FileSystemWatcher
但是为了监视整个目录,这显然是一个正确的选择

如果他们在应用程序中单击“保存”,但不关闭它怎么办?即使在观察者报告进行了更改后,该文件仍可能被锁定且无法读取,但这取决于编辑器

另一种方法是自己直接启动编辑应用程序,并监视该过程,以查看用户何时关闭该应用程序,尽管使用选项卡式编辑器在同一过程中打开多个文档可能会有问题

因此,为了可靠性,像FTP客户端这样的应用程序通常使用定时循环,监视文件大小和修改日期属性的更改,然后对文件执行操作


需要注意的是,在采取行动之前,您可能需要延迟,因为病毒扫描程序也可以在发生更改后锁定和扫描文件,从而阻止您的代码立即访问。

正如M4GNV5所说,
FileSystemWatcher
可以解决此问题,但这有点过头了。在代码中使用one非常复杂,因为它非常容易出错,并且需要非常精确的使用模式才能成功。它也有一定的开销,因为它需要在内核模式下连接到文件系统驱动程序

另一种解决方案可能使用轮询

FileInfo info = new FileInfo(filePath);
DateTime oldTime = info.LastWriteTimeUtc;

while(true)
{
    do
    {
        await Task.Wait(1000);
        info.Refresh();
    } while(info.LastWriteTimeUtc == oldTime);

    try
    {
        using(Stream s = File.OpenRead(filePath))
        {
            // ok, file was modified and is unlocked. copy back.
        }

        break;
    }
    catch(IOException)
    {
        // file is locked, retry.
        oldTime = info.LastWriteTimeUtc;
    }
}

这首先等待文件的修改时间更改,然后检查文件是否被解锁。

您可以使用FileSystemWatcher监视单个文件。可以将过滤器属性设置为感兴趣的特定文件。或者将其设置为*.mdb(或类似值),并比较FileSystemEventArgs路径,以仅在更改事件针对您感兴趣的文件时执行某些操作

伪代码:

  • 当他们签出文件时,在文件系统上创建它,并创建一个文件系统监视程序,该监视程序具有与文件匹配的筛选器,并订阅更改的事件
  • 在已更改的事件中,检查您是否可以访问该文件,即是否释放了锁,如果是,则执行您想执行的任何操作
这是最好的解决方案吗?这取决于几个因素。他们是否可以保存正在进行的工作,从而使文件处于锁定状态,然后退出而不再保存?如果是这样,您将不会得到第二个更改事件


虽然很粗糙,但轮询(在计时器上检查文件的状态以及上次修改的属性是否已更改)可能是一个更好的解决方案。

您的意思是用户将向数据库添加记录吗。。?如果是这样,写一个简单的查询。。或者他们正在添加自己的access db文件。。?如果是,则可以检查/访问创建和/或修改属性处的FileWatacher。。请更具体,以及为clarification@DJKRAZE-用户将向数据库中添加记录,该数据库的一部分将作为OLE对象或附件的物理文件。当他们从数据库中“签出”文件来处理它时,我需要监视它。那么,对于监视单个文件,您有什么建议?我认为这取决于问题。Tim说只要用户编辑文件,文件就会被锁定,所以我认为最好的方法是设置一个计时器,并尝试每隔x秒以写入模式打开文件,看看它是否仍然存在locked@WholsRich-启动编辑应用程序的问题是,它可能是任何应用程序。用户可以在数据库中签入的文件没有限制,因此可能是work、excel、图像等。然后循环检查是一个明智的选择,只需记住逻辑可能会中断的方式,一些应用程序在编辑过程中不会锁定,人们可能会在应用程序之间切换,打开多个文件如何工作,旧的办公机器可能会很慢,在更新最后一次写入和发布文件之间有一段时间的延迟,等等。是的,我自己的想法或多或少是一样的,但幸运的是,我有需要全天候运行的应用程序的经验。谢谢你,Cory Nelson建议了同样的方法。这正是为什么我在头一个跑到文件系统观察器之前把这个问题贴在这里的原因!谢谢你,这似乎是一个更简单的方法!很高兴在我头一个跑进文件系统监视之前问过你。如果我相信我可以让它工作的话,我想可能需要花费大量的开发和支持时间来整理所有的问题。如果你感兴趣的话,我有一些使用Rx框架的代码。使它变得简单一点,但仍然不简单。谢谢,谢谢!