如何测试当前是否正在写入文件
我有一个应用程序,必须检查文件夹并读取复制到其中的任何文件。 如何测试当前是否正在写入该文件夹中的文件? 我只想读取已经写入所有数据并关闭的文件。
它不干净,但它的工作原理:
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 }
我并不特别喜欢使用exception作为条件,但据我所知,这是关于最简单,最好(也是唯一可靠)的方法。
也许像这样打开文件 –
System.IO.File.Open(PathToFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
这可以放在一个带有try / catch的循环中,直到它成功。
捕获exception是昂贵的,您应该尝试使用此:
https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx
msdn页面上有一个非常清晰的例子。 这将为您提供有关更改,创建,删除,重命名的精彩事件。
将文件复制到文件夹中,并在完成捕获重命名事件时重命名,并确保您没有读取尚未完成的文件。
或者你可以抓住变化事件直到(这很棘手)他们不再被解雇了。
我唯一能想到的是文件锁在写入时会被放在文件上,因此阻止你写入文件(抛出一个System.IOexception的文件被另一个进程锁定),但是这个不是万无一失的。 例如,可以通过打开和关闭每个块的文件来以块的forms写入文件。
所以你可以用try / catch块做到这一点:
try { //opening the file } catch(IOException ex) { // file is open by another process }
写入的文件通常会对其进行写锁定,因此如果您尝试将其打开以进行写入,则会失败; 但OTOH你可能有一个打开,写入和关闭文件的进程 – 然后重复。 我认为最简单和最安全的方法就是检查最近写入的文件,但不是最近的文件(例如最近2秒左右)
[le]需要考虑的另一点是,如果你有一个以chunck(open-write-close)写入数据的进程,并且你获得了该文件的独占锁(以检查该文件是否已被使用) – 而不是你的外部过程将失败。 我认为检查时间戳要好得多,只有在你有理由确定其他进程完成写入后才能获得独占锁。
当您使用System.IO.File.OpenWrite(filename)
打开它时,它应该抛出IOException
。
因此,在try catch中,catch块中执行的代码应该告诉您文件是打开的。
选项数量。 直接想到的那个是尝试打开文件进行写入。 如果你引发exception,它仍然被写入。 等待一段时间再试一次。
或者,检查时间戳,仅在上次更改时间戳后1或2分钟尝试读取文件
使用System.IO.FileSystemWatcher
确定更改的文件。
在专用阅读器( FileMode.Read
)中打开它们制作副本,如果失败则捕获exception(因为其他人将其打开以进行写入)。
如果您对写入的进程有任何控制权,那么请考虑对其进行扩充,以便执行以下过程:
- 进程开始写文件“filename.xyz”
- 进程写入更多文件“filename.xyz”
- ….
- ….
- 进程完成写入文件“filename.xyz”
- 进程将另一个(零长度,空)文件写入名为“filename.xyz.done”的文件夹中
您可以查找“.done”文件作为开始处理文件的触发器。 同样,只有在您有任何方法可以修改写入文件的过程时,这才有效。
上述就是C#学习教程:如何测试当前是否正在写入文件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/961286.html