等待TXT文件可读c#

时间:2009-08-11 15:20:41

标签: c#

我的应用程序使用“FileSystemWatcher()”在“X”应用程序创建TXT文件时引发事件,然后读取其内容。

“X”应用程序创建一个文件(我的应用程序成功检测到它)但是需要一些时间来填充它上面的数据,因此在创建时无法读取此txt文件,所以我

寻找等待txt文件可供阅读的内容。不是静态延迟,而是与该文件相关的东西。

任何帮助? THX

9 个答案:

答案 0 :(得分:4)

像这样创建文件:

MyFile.tmp文件

然后当它完成后,将其重命名为

myfile.txt的

让你的filewatcher注意.txt扩展名

答案 1 :(得分:3)

我发现这样做的唯一方法是尝试在循环中读取文件,并在没有异常时退出循环。希望其他人能想出更好的方法......

bool FileRead = false;

while (!FileRead)
{
   try
   {

      // code to read file, which you already know
      FileRead = true;
   }
   catch(Exception)
   {
      // do nothing or optionally cause the code to sleep for a second or two

   }


}

答案 2 :(得分:2)

您可以跟踪文件的Changed事件,看看它是否可用于更改。如果文件仍处于锁定状态,请注意下一个更改事件。

答案 3 :(得分:1)

您可以打开并阅读这样的锁定文件

using (var stream = new FileStream(@"c:\temp\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
   using (var file = new StreamReader(stream)) {
      while (!file.EndOfStream) {
         var line = file.ReadLine();
         Console.WriteLine(line);
      }
   }
}

但是,请确保文件编写器刷新,否则您可能看不到任何更改。

答案 4 :(得分:1)

应用程序X应该锁定文件,直到它关闭它。应用程序X是否也是.NET应用程序,您可以修改它吗?在这种情况下,您只需使用FileInfo类和FileShare的正确值(在这种情况下为FileShare.Read)。

如果您无法控制应用程序X,情况就会变得复杂一些。但是,您始终可以尝试通过相同的FileInfo.Open方法独占打开文件。在这种情况下提供FileShare.None。它将尝试以独占方式打开文件,如果文件仍在使用中将失败。您可以在循环内执行此操作,直到文件被应用程序X关闭并准备好读取。

答案 5 :(得分:1)

我们有一个虚拟打印机用于创建pdf文档,我这样做是为了在文档发送到打印机后访问该文档:

using (FileSystemWatcher watcher = new FileSystemWatcher(folder))
{
    if(!File.Exists(docname))
        for (int i = 0; i < 3; i++)
            watcher.WaitForChanged(WatcherChangeTypes.Created, i * 1000);
}

所以我等了总共6秒(有些文件可能需要一段时间才能打印,但大多数文件来得非常快,因此等待时间会增加),然后才能确定出现问题。

在此之后,我也读了一个for循环,就像我等待它创建一样。我是这样做的,以防万一文档已经创建,但尚未由打印机发布,几乎每次都会发生。

答案 6 :(得分:0)

您可以使用相同的类在文件更改时收到通知。

  

当对正在监视的目录中的文件或目录的大小,系统属性,上次写入时间,上次访问时间或安全权限进行更改时,将引发Changed事件。

所以我认为您可以使用该事件来检查文件是否可读,如果是,则打开它。

答案 7 :(得分:0)

如果您有自己的数据库,我建议您使用数据库表作为带有文件名的队列,然后再监视它。很好,也是交易性的。

答案 8 :(得分:-1)

您可以检查文件的大小是否已更改。虽然这需要您以某种频率轮询它的值 此外,如果您想更快地获取数据,可以在写作时.Flush(),并确保在您完成写入后立即.Close()流。