如果已创建* txt文件,则我的代码正在循环内搜索。 如果在x次之后将不会创建文件,那么我将抛出异常。 这是我的代码:
var AnswerFile = @"C:\myFile.txt";
for (int i = 0; i <= 30; i++)
{
if (File.Exists(AnswerFile))
break;
await Task.Delay(100);
}
if (File.Exists(AnswerFile))
{
}
else
{
}
循环后,我检查我的文件是否已创建。循环将在3秒100ms * 30次后终止。 我的代码正在运行,我只是在寻找代码的性能和质量。有没有比我更好的方法了?我应该使用FileInfo类代替示例吗?
var fi1 = new FileInfo(AnswerFile);
if(fi1.Exists)
{
}
还是我应该使用Filewatcher类?
答案 0 :(得分:3)
您也许应该为此使用FileSystemWatcher,并将创建文件的过程与对文件的存在做出反应的过程脱钩。如果文件由于有一定的到期时间而必须在一定时间内生成,则可以将到期日期时间作为文件名的一部分,这样,如果在该时间之后出现,则表示文件已过期。 FileSystemWatcher的注意事项-有时可能会遗漏某些内容(the fine manual表示如果在短时间内生成大量事件可能会遗漏事件)
过去,我曾用它来监视通过ftp上传的文件。出现创建文件的通知后,我将文件放入列表中,并定期检查它是否仍在增长-您可以为此查看文件系统监视程序的lastwritetime事件,或直接检查文件的大小。前一段时间等等-在这两种方法中,使用字典来跟踪文件和先前的大小/最近的lastwritedate事件可能是最简单的。 一分钟没有增长后,我认为文件已完全上传并进行了处理。如果使用文件系统监视程序并且文件是通过某种缓慢的生成方法到达的,那么对您来说,实现类似的延迟可能是明智的选择
答案 1 :(得分:0)
为什么不检索文件名列表,而是在列表中搜索?您可以使用Directory.GetFiles
获取目录中的文件列表,然后在该列表中搜索。
对于您来说,这将是更可修复的,因为您只需创建一次列表,然后在应用程序中重复使用它,而不是为每个文件调用File.Exists
。
示例:
var path = @"C:\folder\"; // set the folder path, which contains all answers files
var ext = "*.txt"; // set the file extension.
// GET filename list (bare name) and make them all lowercase.
var files = Directory.GetFiles(path, ext).Select(x=> x.Substring(path.Length, (x.Length - path.Length) - ext.Length + 1 ).Trim().ToLower()).ToList();
// Search for this filename
var search = "myFile";
// Check
if(files.Contains(search.ToLower()))
{
Console.WriteLine($"File : {search} is already existed.");
}
else
{
Console.WriteLine($"File : {search} is not found.");
}