我在用FileSystemWatcher组件监视本地文件夹变化的时候,我想在文件夹的文件或子文件夹变化的时候,将变化的文件或文件夹记录到一个xml文件里,要是里面有子文件夹就将子文件夹名作为xml的一个节点,里面的文件就作为这个节点的值。只有文件名而没有子文件夹的话,就默认创建一个节点(如INV2010-00001),然后将文件作为节点值
如果我监控A目录下的变化情况,当我往这个A目录下拷贝一个文件(如:123.jpg)和一个文件夹abc(这个文件夹里有一个文件342.jpg),那么我记录到xml文件里就应该是:<Images>
  <List>
    <abc>342.jpg</abc>
    <INV2010-00001>123.jpg</INV2010-00001>
  </List>
</Images>Window服务部分代码:protected override void OnStart(string[] args)
        {
            // TODO: 在此处添加代码以启动服务。
            Watching();
        }
private void Watching()
        {
            fileWatcher.Path = WatcherTool.GetInstance.WatchPath;
            fileWatcher.Filter = WatcherTool.GetInstance.WatchFileType;
            fileWatcher.IncludeSubdirectories = WatcherTool.GetInstance.IsIncludeSubDirectory;
            fileWatcher.Created += new FileSystemEventHandler(fileWatcher_Created);
        }        private void fileWatcher_Created(object sender, FileSystemEventArgs e)
        { 
            if (e.ChangeType == WatcherChangeTypes.Created)
            {
                //E:\\XXX\\Project\\Picture\\INV2010-00012\\135555.jpg
                string fullPath = e.FullPath; //图片所在的完整路径
                string fileName = fullPath.Substring(fullPath.LastIndexOf("\\") + 1); //图片的文件名
                string fileFolder = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1);//图片所在的文件夹目录,如:D:\\images\\20101121\\
                string filePath = fileFolder.Substring(fileFolder.LastIndexOf('\\') + 1) + "\\" + fileName; //图片所在的文件夹,如:20101112\\12355.jpg                WatcherTool.GetInstance.WritePictureChangeLog(filePath);
            }
        }
WatcherTool类部分代码:
public void WritePictureChangeLog(string fileName)
        {
                char[] sp = new char[]{'\\'};
                string path = string.Empty;
                string file = string.Empty;
                if (fileName.IndexOfAny(sp) != -1)
                {
                    path = fileName.Substring(0, fileName.IndexOf('\\'));
                    file = fileName.Substring(fileName.IndexOf('\\') + 1);
                }
                else
                {
                    path = "INV" + DateTime.Now.ToString("yyyy") + "00001";
                    file = fileName;
                }
                XmlConfigFactory.PictureConfig.InsertMulti("PictureList/PicturePath", path, file);
        }
InsertMulti方法:
public void InsertMulti(string xPath, string nodeName, string nodeValue)
        {
            ClearCache();
            try
            {
                XmlNode node = doc.SelectSingleNode(xPath);
                if (node != null)
                {
                    XmlElement element = doc.CreateElement(nodeName);
                    element.InnerText = nodeValue;
                    node.AppendChild(element);                    doc.Save(filePath);
                }
            }
            catch (Exception ex)
            {
                WatcherTool.GetInstance.Error(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + " ==> " + ex.Message);
            }
        }

解决方案 »

  1.   

    现在的问题是:如果我往里面拷贝一个单独的文件(如:3333.jpg)的话,就会报错“元素或属性的本地名称不能为空或空字符串。”,因为这个时候WritePictureChangeLog方法里产生的path是一个空字符串。还有一点,我不明白为什么我拷贝一个文件夹到A目录下,e.FullPath产生的路径是//E:\\XXX\\Project\\Picture\\INV2010-00012而不是//E:\\XXX\\Project\\Picture\\INV2010-00012\\135555.jpg
      

  2.   

    代码好长啊看看哪儿抛异常啊设置几个断点Debug一下string fullPath = e.FullPath; //图片所在的完整路径
                    string fileName = fullPath.Substring(fullPath.LastIndexOf("\\") + 1); //图片的文件名
                    string fileFolder = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1);//图片所在的文件夹目录,如:D:\\images\\20101121\\
                    string filePath = fileFolder.Substring(fileFolder.LastIndexOf('\\') + 1) + "\\" + fileName; //图片所在的文件夹,如:20101112\\12355.jpg没有看明白怎么回事
      

  3.   

    加上fileWatcher.EnableRaisingEvents = true;