急求:FileSystemWatcher监视文件夹的问题

jasonlee0927 2010-11-21 05:43:27
我在用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);
}
}
...全文
565 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LutzMark 2010-11-21
  • 打赏
  • 举报
回复
加上fileWatcher.EnableRaisingEvents = true;
Teng_s2000 2010-11-21
  • 打赏
  • 举报
回复
代码好长啊

看看哪儿抛异常啊设置几个断点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

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

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧