FileSystemWatcher扭曲文件名

时间:2012-06-24 10:08:43

标签: c# .net filesystemwatcher

我正在使用FileSystemWatcher来检测 .docx 文件。打开时会检测文件,但文件名始终“已损坏”。

3个例子:

  1. 如果我的文件名为: 2711111.docx ,则FileSystemWatcher.Changed中收到的文件名为:〜$ 711111.docx

  2. 对于文件:* 2711111_1.docx *我得到文件名:*〜$ 11111_1.docx * 我不知道我的文件名是什么,所以我正在寻找一个通用的解决方案。

  3. 对于包含/以字母开头的文件,它不会发生。

  4. 这是我的代码

    MyPath = String.Format(@"C:\Users\{0}\NRPortbl\ACTIVE\{1}\"", 
             Public.UserName, Public.UserName);
    
    FileSystemWatcher watcher = new FileSystemWatcher();
    if (!System.IO.Directory.Exists(MyPath))
    {
        Public.Logger.Error(
            String.Format
                ("Path of folders {0} not found", MyPath));
        System.Windows.Forms.MessageBox.Show(
            String.Format(
                "There was a problem loading {0} " + 
                "NRPortbl libraray, contact administrator", Public.UserName));
        return;
    }
    watcher.Path = MyPath;
    watcher.Filter = "*.Docx";                                                      
    watcher.IncludeSubdirectories = false;
    watcher.Changed += new FileSystemEventHandler(OnChanged);                       
    watcher.Deleted += new FileSystemEventHandler(OnDeleted);
    watcher.EnableRaisingEvents = true;  ... 
    public void OnChanged(object source, FileSystemEventArgs e)  {...}
    

    帮助将不胜感激:)谢谢!

3 个答案:

答案 0 :(得分:5)

这是为Microsoft Word设计的。它在用户打开文档时创建隐藏文件。该文件记录了用户名,以便当其他人试图打开同一个文档时,他们会收到一条体面的消息,告诉他们当前用户打开了哪些用户进行编辑。

该隐藏文件的文件名是原始文件名,前两个字符替换为~$

在使用资源管理器查看目录时,通常不会看到此文件,因为它已打开FileAttributes.Hidden属性。当然你也想忽略这些文件,使用FileInfo.Attributes属性来过滤它们。

答案 1 :(得分:4)

订阅更多活动,例如重命名,并输出他们的文件名。

我怀疑你所看到的是临时文件名,它会被重命名更改为实际文件名。

答案 2 :(得分:1)

未经测试的代码,但我记得自己在这之前做过这样的伎俩..

首先,当您打开文件或保存文件时,OnChanged事件将(希望)多次触发。所以你可以看到,你得到了正确的文件名。要看到这一点,您可以使用文件存在函数和其他一些技巧。像这样左右:

public void OnChanged(object source, FileSystemEventArgs e) 
{
     if (e.FullPath.Contains("~$")) //to avoid the corruption you are talking about.
         return;                    //or better handling - trivial

     if (!File.Exists(e.FullPath)) //to avoid some temp files that need not be visible
         return;                   //but happens with doc files. 

     //got the file e.FullPath
}

如果您没有获得所需的文件,您可以订阅另一个事件,即重命名事件。