我的应用程序使用“FileSystemWatcher()”在“X”应用程序创建TXT文件时引发事件,然后读取其内容。
“X”应用程序创建一个文件(我的应用程序成功检测到它)但是需要一些时间来填充它上面的数据,因此在创建时无法读取此txt文件,所以我
寻找等待txt文件可供阅读的内容。不是静态延迟,而是与该文件相关的东西。
任何帮助? THX
答案 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()
流。