我正在使用FileSystemWatcher
来检测 .docx 文件。打开时会检测文件,但文件名始终“已损坏”。
3个例子:
如果我的文件名为: 2711111.docx ,则FileSystemWatcher.Changed
中收到的文件名为:〜$ 711111.docx 。
对于文件:* 2711111_1.docx *我得到文件名:*〜$ 11111_1.docx * 我不知道我的文件名是什么,所以我正在寻找一个通用的解决方案。
对于包含/以字母开头的文件,它不会发生。
这是我的代码
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) {...}
帮助将不胜感激:)谢谢!
答案 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
}
如果您没有获得所需的文件,您可以订阅另一个事件,即重命名事件。