我递归搜索目录,我只需要确保文件是打开的,或者当前正在写入,它将不会在文件列表中返回。
(这是一个FTP组件,我不希望发送文件,如果它已经打开写入)
谢谢, 凯文
答案 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()调用,也无法知道状态仍然与第一次检查时的状态相同。