我在阅读文本文件时遇到了问题,这不是阅读它本身就是我应该阅读时的问题。
我有一个服务器程序(由外部公司制作,所以我无法控制它)你可以放入文件。服务器看到一个新文件到达读取它并用它做事情然后他给出了结果背部。所以我正在等待文件准备好,但我无法早期阅读它,因为我不知道它是否已经存在。所以我这样做:
while (IsFileLocked(file))
{
Thread.Sleep(25);
}
private bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
现在这确实有助于检查文件是否可读,并且在我阅读时我再也没有得到任何IOExceptions。现在我开始阅读但有时我只是读了一个空文件。而且我很确定它不应该是空的。这不是服务器程序的错误(我稍后会解释)。
以下是问题开始的代码:
using (StreamReader streamReader = file.OpenText())
{
while (!streamReader.EndOfStream)
{
// here starts the reading
}
}
但是当我使用这段代码时,我没有遇到问题:
using (StreamReader streamReader = file.OpenText())
{
Thread.sleep(1000);
while (!streamReader.EndOfStream)
{
// here starts the reading
}
}
所以我的猜测是,当我可以打开它时文件是空的,但它没有文本。 我将Thread.sleep更改为100毫秒,然后我再次遇到问题。当我将其更改为500时,问题再次得到解决。
现在我的软件需要在很多不同的计算机上运行,所以我不知道它们有多快,但我担心如果我将计时器设置为低,我可能会在其他计算机上遇到问题。但我不希望我的用户等待那里的信息很长。 等待唯一的选择还是有另一种方式? 在具有不同硬件配置的其他计算机上是否会出现问题?
编辑:我尝试过FileSystemWatcher,这不是解决方案!
答案 0 :(得分:0)
答案 1 :(得分:0)
您需要添加的工具是FileWatcher(请参阅MSDN System.IO.FileWatcher)。这将允许您监视活动并添加事件处理程序以响应文件事件。您可以通过添加文件更改的处理程序来响应创建的文件。
答案 2 :(得分:0)