2011-05-05 89 views
0

我有一个问题,阅读的文本文件,这不是它的自我这是一个问题是,当我应该看它的读数。问题与阅读文本文件

我得到了一个服务器程序(由外部公司制作,所以我无法控制它),你可以在其中放置文件。服务器看到一个新文件已经到达读取它并执行任务,然后他放入一个结果回来。所以我正在等待文件准备就绪,但我不能早点阅读它,因为我不知道它是否已经存在。所以我这样做:

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

你可以使用FileSystemWatcher的通知您,当一个文件已经到来。这样你就知道它在那里。您仍然需要检查它是否可读,因为FileSystemWatcher在创建文件时会通知您,即在可读之前可能需要几秒钟才能写入文件。我已经实现了一个类似的解决方案,用于处理在一天中的不同时间将FTP传输到目录的文件。 – tomasmcguinness 2011-05-05 14:07:30

+0

@tomasmcguinness文件创建的事件被观察者扔在文件被创建时,但可能还不是可读的。当文件完全写入并且可用时,它将会抛出一个'文件改变'事件。此时该文件可用。 – 2011-05-05 14:35:28

+0

添加一个FileSystemWatcher没有解决我的问题我刚刚再次遇到同样的问题。即使使用watcherchangetypes,我仍然阅读一个空文件。当我使用Thread.sleep()时,它会再次完美。所以它看起来像filesystemwatcher只不过是我的代码的.NET实现。 – 2011-05-06 10:20:32

回答

0

您需要添加的工具是一个FileWatcher(见MSDN System.IO.FileWatcher)。这将允许您监视活动并添加事件处理程序来响应文件事件。您可以通过为文件更改添加处理程序来响应文件。