我有一个应用程序必须检查文件夹并读取复制到其中的任何文件。 如何测试当前是否正在写入该文件夹中的文件?我只想读文件 已将所有数据写入其中并关闭。
答案 0 :(得分:17)
它不干净,但有效:
try
{
using (Stream stream = new FileStream("File.txt"))
{
}
}
catch
{
// Check if file is in use (or whatever else went wrong), and do any user communication that you need to
}
我并不特别喜欢使用异常作为条件,但据我所知,这是关于最简单,最好(也是唯一可靠)的方法。
答案 1 :(得分:2)
也许像这样打开文件 -
System.IO.File.Open(PathToFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
可以将其置于带有try / catch的循环中,直到成功。
答案 2 :(得分:2)
捕捉异常很贵,你应该尝试使用它:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx
在msdn页面上有一个非常明确的例子。这将为您提供有关变更,创建,删除,重命名的精彩活动。
将文件复制到文件夹中,并在完成捕获重命名事件时重命名,并确保您没有读取尚未完成的文件。
或者你可以捕捉到变化事件,直到(这很棘手)它们不再被触发。
答案 3 :(得分:1)
我唯一能想到的是文件锁在写入时会被放在文件上,因此会阻止你写入文件(抛出另一个进程锁定文件的System.IO异常) ,但这不是万无一失的。例如,可以通过打开和关闭每个块的文件来将文件写入块中。
所以你可以用try / catch块做到这一点:
try
{
//opening the file
}
catch(IOException ex)
{
// file is open by another process
}
答案 4 :(得分:1)
当您使用System.IO.File.OpenWrite(filename)
打开它时,它应该抛出IOException
。
所以,在try catch中,catch块中执行的代码应该告诉你文件是打开的。
答案 5 :(得分:1)
写入的文件通常会对其进行写锁定,因此如果您尝试将其打开以进行写入,则会失败;但OTOH你可能有一个打开,写入和关闭文件的进程 - 然后重复。 我认为最简单和最安全的方法是检查最近写入的文件,但不是最近的文件(例如最近2秒左右)
[le]需要考虑的另一点是,如果你有一个在chunck(open-write-close)中写入数据的进程,你得到一个文件的独占锁(检查文件是否不再使用) - 比你的外部过程失败。我认为检查时间戳要好得多,只有在你有理由确定其他进程写完之后才能获得独占锁。
答案 6 :(得分:0)
选项数量。直接想到的那个是尝试打开文件进行写入。如果你引发异常,它仍然被写入。等待一段时间,然后再试一次。
或者检查时间戳,只在上次更改时间戳后1或2分钟尝试读取文件
答案 7 :(得分:0)
使用System.IO.FileSystemWatcher
确定已更改的文件。
在exclusive reader (FileMode.Read
)中打开它们制作副本,并在失败时捕获异常(因为其他人已将其打开以进行书写)。
答案 8 :(得分:0)
如果您对写入的过程有任何控制权,那么请考虑对其进行扩充,以便进行以下过程:
您可以查找“.done”文件作为开始处理文件的触发器。同样,只有在你有办法修改文件写入的过程时,这才有效。