当我运行下面的代码时,它会在我的数组中填充指定目录中的文件列表。
这很好。
但是,它还会抓取“飞行中”的文件 - 这意味着当前正在复制到该目录的文件。
这很糟糕。
如何忽略那些'飞行中'文件?有没有办法在处理之前检查每个文件以确保它“完全存在”?
string[] files = Directory.GetFiles(ConfigurationSettings.AppSettings.Get("sourcePath"));
if (files.Length > 0)
{
foreach (string filename in files)
{
string filenameonly = Path.GetFileName(filename);
AMPFileEntity afe = new AMPFileEntity(filenameonly);
afe.processFile();
}
}
答案 0 :(得分:5)
不幸的是,没有办法实现你想要的。罗伯特关于打开文件写作的建议解决了问题的一个子集,但没有解决更大的问题
最好将文件系统视为没有同步功能的多线程对象
无论您尝试使用什么同步构造将文件系统置于“已知状态”,用户都有一种方法可以击败它。
解决此问题的最佳方法是正常处理文件并捕获使用“正在运行”的文件导致的异常。这是处理文件系统的唯一理智方式。
答案 1 :(得分:4)
是的,您可以尝试打开文件进行编写。如果你能够在没有例外的情况下开放写作,那么它可能不再“在飞行中”了。不幸的是,我之前曾多次遇到过这个问题,并没有找到更好的解决方案。
答案 2 :(得分:1)
您可以通过p /调用NtQuerySystemInformation获取打开句柄列表。有a project on CodeProject显示了如何执行此操作。或者,您可以从Sysinternals调用Handle.exe并解析其输出。
答案 3 :(得分:0)
尝试重命名/移动文件。如果你可以重命名它,它就不再使用了。
答案 4 :(得分:0)
卡拉的回答给了我一个想法。
如果您有权访问将文件复制到此目录的程序,请将其修改为:
在同一文件系统上,移动操作只更新目录条目,而不是更改文件在磁盘上的物理位置。这意味着它非常快。