文件正由另一个进程使用
我有一个大致这样做的程序:
- 打开一个文件来读取它。
- 关闭文件
- 启动filewatcher以监视文件中的更改。
- 一旦检测到更改,filewatcher的EnableRaisingEvents标志将设置为false,并且该过程将从步骤1开始重复。
问题是,在从第4步到第1步之后,它无法读取文件说它正被另一个进程使用。
我收到错误:
未处理的exception:System.IO.IOException:进程无法访问文件’c: test.xml’,因为它正由另一个进程使用。
什么出错了? 我的程序的第1步的读者是否仍然打开文件,或者是访问该文件的一些完全不同的进程,还是在从4移动到步骤1之后,filewatcher仍在观看文件,尽管将标志设置为false?
如果您的代码与此类似:
[STAThread] static void Main(string[] args) { string file = "temp.txt"; ReadFile(file); FileSystemWatcher fswatcher = new FileSystemWatcher(".\"); fswatcher.Changed += delegate(object sender, FileSystemEventArgs e) { ReadFile(e.FullPath); }; while (true) { fswatcher.WaitForChanged(WatcherChangeTypes.Changed); } } private static void ReadFile(string file) { Stream stream = File.OpenRead(file); StreamReader streamReader = new StreamReader(stream); string str = streamReader.ReadToEnd(); MessageBox.Show(str); streamReader.Close(); stream.Close(); }
如果您通过记事本编辑文件,那么,当您单击保存按钮时,它会保持文件打开,就像您只是关闭程序并单击保存它不会。 我不知道这是一个bug还是记事本的无记录function,但这可能是你的问题。 解决此问题的一种方法是执行以下操作:
在您的匿名委托中,或者在您执行调用ReadFile()
任何地方调用Thread.Sleep(1000)
,让程序在读取文件之前等待,您的代码应该可以正常工作。
您可以使用https://www.sysinternals.com等Process Explorer之类的工具查看谁拥有该流程的开放句柄
该文件最有可能由于首先导致更改通知而触发。
除了其他答案之外,当FileWatcher
对文件作出反应时,它可能尚未被该应用程序关闭。 在步骤1中尽量不要立即失败,但尝试多次尝试,延迟时间很短。
注意:即使在记事本中打开“file.txt”,此代码仍然有效,因为它正在打开以进行读取。
using System; using System.IO; class Program { static void Main(string[] args) { ReadFromFile(@"C:file.txt"); Console.ReadLine(); } static void ReadFromFile(string filename) { string line; using (StreamReader sr = File.OpenText(filename)) { line = sr.ReadLine(); while (line != null) { Console.WriteLine(str); line = sr.ReadLine(); } sr.Close(); } } }
要不就:
string text = System.IO.File.ReadAllText(@"C:file.txt");
问题是FileSystemWatcher会立即告诉您文件的创建时间。 它不会等待文件被释放。 例如,当您复制一个需要3秒钟复制的大文件时,您必须在此之后打开该文件。
https://www.codeproject.com/Questions/461666/FileSystemWatcher-issue-in-windows-application 等到文件在.NET中解锁
有很多事情可以发生。
首先,通过利用实现IDisposable
所有内容的using子句,确保正确处理文件编写器(close不够好)。
其次,您只是阅读,确保在打开文件时设置了正确的标志。
如果你提供了一个显示你是如何完成这个的代码块,那么它会更进一步。 特别是在阅读文件时
您可以使用此MS实用程序openfiles获取已打开文件的列表,并了解谁已打开该文件。
openfiles /query
它还允许断开网络用户打开的文件。
openfiles /disconnect /id XXXX
如果要将其用于本地PC,则应设置“维护对象列表”全局标志:
openfiles /local on
点击链接获取更多详细信息。
上述就是C#学习教程:文件正由另一个进程使用分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/989940.html