忽略飞行中的文件

时间:2009-12-09 18:31:11

标签: c#

当我运行下面的代码时,它会在我的数组中填充指定目录中的文件列表。

这很好。

但是,它还会抓取“飞行中”的文件 - 这意味着当前正在复制到该目录的文件。

这很糟糕。

如何忽略那些'飞行中'文件?有没有办法在处理之前检查每个文件以确保它“完全存在”?

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();
            }

        }

5 个答案:

答案 0 :(得分:5)

不幸的是,没有办法实现你想要的。罗伯特关于打开文件写作的建议解决了问题的一个子集,但没有解决更大的问题

  

最好将文件系统视为没有同步功能的多线程对象

无论您尝试使用什么同步构造将文件系统置于“已知状态”,用户都有一种方法可以击败它。

解决此问题的最佳方法是正常处理文件并捕获使用“正在运行”的文件导致的异常。这是处理文件系统的唯一理智方式。

答案 1 :(得分:4)

是的,您可以尝试打开文件进行编写。如果你能够在没有例外的情况下开放写作,那么它可能不再“在飞行中”了。不幸的是,我之前曾多次遇到过这个问题,并没有找到更好的解决方案。

答案 2 :(得分:1)

  1. 获取目录中的文件列表。
  2. 获取打开手柄列表(见下文)。
  3. 从前者中删除后者。
  4. 您可以通过p /调用NtQuerySystemInformation获取打开句柄列表。有a project on CodeProject显示了如何执行此操作。或者,您可以从Sysinternals调用Handle.exe并解析其输出。

答案 3 :(得分:0)

尝试重命名/移动文件。如果你可以重命名它,它就不再使用了。

答案 4 :(得分:0)

卡拉的回答给了我一个想法。

如果您有权访问将文件复制到此目录的程序,请将其修改为:

  1. 将文件写入同一磁盘上的临时目录。
  2. 完成写入磁盘后,将文件移动到相应的文件夹中。
  3. 在同一文件系统上,移动操作只更新目录条目,而不是更改文件在磁盘上的物理位置。这意味着它非常快。