FileSystemWatcher行为不一致

时间:2013-08-29 06:50:10

标签: c# winforms filesystemwatcher

我在设计器中设置了所有FSW属性(EnableRaisingEvents = true,filter = * .tif,IncludeSubdirectories = true,path = bla \ bla \ bla)。

该应用程序在Windows Server 2008 R2 Standard计算机上运行,​​并在本地文件夹中查找已创建的文件。而不是“C:\”我使用计算机网络名称“GRAHAM”。

问题是,在创建文件/移动到监视目录时,FSW并不总是触发。似乎有时它确实如此,但大多数情况下它没有。

从我的机器调试和观看该文件夹时,也有一些奇怪的行为。如果我远程控制服务器计算机并将文件移动到监视文件夹没有任何反应。但是,如果我将文件从共享网络文件夹中移动到监视文件夹中,则每次都会触发FSW。

这让我很难找到错误/错误。有人有任何想法吗?

这是所有代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

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

        private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
        {
            StringBuilder log = new StringBuilder();

            try
            {
                log.Append("--------------------").AppendLine().Append(DateTime.Now).AppendLine().Append("--------------------").AppendLine();

                FileInfo file = new FileInfo(e.FullPath);

                while (IsFileLocked(file))
                {
                    System.Threading.Thread.Sleep(300);
                }
                string oFile = e.FullPath;
                string nFile = oFile.Insert(oFile.Length - 4, "_" + DateTime.Now.ToString().Replace(" ", "").Replace("-", "").Replace(":", "")).Replace("\\XML Konvertering", "").Replace(@"\\GRAHAM\AnyDoc Invoices", @"\\FAKTURASERVER\AnyDoc");

                if (!Directory.Exists(nFile.Substring(0, nFile.LastIndexOf('\\'))))
                {
                    Directory.CreateDirectory(nFile.Substring(0, nFile.LastIndexOf('\\')));
                    File.Move(oFile, nFile);
                    Directory.Delete(oFile.Substring(0, oFile.LastIndexOf('\\')));
                }
                else
                {
                    File.Move(oFile, nFile);
                }

                log.Append("* Moved and stamped file: ").AppendLine().Append(oFile).Append(" to ").Append(nFile).AppendLine().Append("--------------------").AppendLine();

            }
            catch (Exception x)
            {
                log.AppendLine().Append("*** ERROR *** ").Append(x).AppendLine().AppendLine();
            }
            finally
            {
                TextWriter tw = new StreamWriter(@"C:\tidslog\log.txt", true, Encoding.Default);
                //TextWriter tw = new StreamWriter(@"C:\PROJEKT\tidsstämplarn\log.txt", true, Encoding.Default);
                tw.Write(log);
                tw.Dispose();
            }
        }

        protected virtual bool IsFileLocked(FileInfo file)
        {
            FileStream stream = null;
            try
            {
                stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            }
            catch (IOException)
            {
                return true;
            }
            finally
            {
                if (stream != null)
                    stream.Close();
            }
            return false;
        }
    }
}

注意:try-catch-finally可能不是很好,但我是新编码,并不确定如何“捕获”东西,记录器从未记录过错误。由于FSW从不发射,因此不可能发生错误。我猜。

1 个答案:

答案 0 :(得分:3)

订阅Error事件并检查错误(如果有)


如果正在创建或更改大量文件,请执行此操作

1> 增加InternalBufferSize

Doc说这个:

  

增加缓冲区的大小可以防止丢失文件系统   改变事件。但是,增加缓冲区大小是昂贵的,因为   它来自非分页内存,无法交换到磁盘,所以   保持缓冲区尽可能小。为避免缓冲区溢出,请使用   过滤掉NotifyFilter和IncludeSubdirectories属性   不需要的更改通知。

2> 此外,您在fileSystemWatcher1_Created中执行了很多操作,这会导致缓冲区溢出,导致错过某些事件...请改用ThreadPool。