DirectoryInfo.GetFiles()是否返回当前正在写入/打开的文件?

时间:2009-09-22 16:39:29

标签: c#

我递归搜索目录,我只需要确保文件是打开的,或者当前正在写入,它将不会在文件列表中返回。

(这是一个FTP组件,我不希望发送文件,如果它已经打开写入)

谢谢, 凯文

4 个答案:

答案 0 :(得分:4)

是的,它将返回仍在使用的文件。它们仍然在目录中,即使您当前无法打开它们。

测试代码以证明它:

using System;
using System.IO;
using System.Linq;

class Test
{
    static void Main()
    {
        File.Delete("test.tmp");
        // Prints false - the delete worked
        Console.WriteLine(Directory.GetFiles(".")
                                   .Any(x => x.EndsWith("\\test.tmp")));
        using (Stream stream = File.Create("test.tmp"))
        {
            // Prints true, even though the stream is still open
            Console.WriteLine(Directory.GetFiles(".")
                                       .Any(x => x.EndsWith("\\test.tmp")));
        }       
    }
}

正如威尔所说,即使你可以这样做,也不能保证你以后能够再打开文件。文件系统检查只会是快照,除非您自己确保一致性 - 例如打开文件并保持打开状态。

答案 1 :(得分:1)

是。我知道的唯一方法是查看文件是否被锁定以尝试阅读它。

答案 2 :(得分:0)

您可以根据每个文件的LastAccessTime建立规则吗?

答案 3 :(得分:0)

您应首先获取列表,该列表将返回目录中存在的所有文件(打开与否),然后在发送文件之前打开每个文件捕获失败。

如果开口没有失败,您可以安全地发送它们(没有人会写或打开它)。如果失败,您知道无法打开文件并跳过它。

即使可以检查GetFiles()调用,也无法知道状态仍然与第一次检查时的状态相同。