检查文件是否被使用
这段内容讨论了如何检查文件是否正在被使用。首先,通过使用File.Exists
方法检查文件是否存在。如果文件存在,尝试在try
和catch
块中打开文件进行写操作,如果生成异常,则表示文件正在被另一个进程使用。然而,通过异常来查找是否被使用并不是最好的方法。
可以尝试以下代码:
protected virtual bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { //文件不可用的原因可能是: //仍在写入 //或者正在被另一个线程处理 //或者文件不存在(已经被处理过) return true; } finally { if (stream != null) stream.Close(); } //文件未被锁定 return false; }
这段代码与pes502的答案非常相似,这是巧合吗?
是的,我是从stackoverflow.com/questions/876473/…中找到的答案,但我添加了检查文件存在性的选项。
在这种情况下,最好明确引用原始答案。
我在那里发现很多评论说这不是一个好主意,但是我曾经使用过它,而且效果很好。所以我只是添加了代码,让他自己选择是否使用它以及检查文件存在性。
检查文件是否正在使用的问题是在访问资源时经常遇到的。这个问题的出现是因为面向对象的原则。当你请求一个对象执行某个操作时,如果它无法按预期完成,则应返回错误信息。在像C++这样的语言中,返回一个错误代码以供开发人员检查,但这种方式容易出错。因此,后来的语言引入了异常,使开发人员能够更好地控制代码。
访问资源是一项复杂的任务,需要考虑很多情况,而且通常涉及多线程。因此,与其关注文件无法被删除的问题并进行检测,不如专注于出现这种情况时应该应用的逻辑。
针对Java的解决方法是使用Files类中的delete方法。当文件不允许被删除时,此方法会抛出SecurityException异常。或者可以使用系统的SecurityManager类中的checkDelete方法,如果调用线程没有权限删除指定的文件,则会抛出SecurityException异常。
针对C#也是同样的规则,使用System.IO.File.Delete方法,当文件无法访问时会抛出UnauthorizedAccessException异常。