【发布时间】:2014-08-15 20:02:22
【问题描述】:
在 Java 和 C# 中,是否有任何函数可以检查文件是否被使用,例如我们尝试删除已使用的文件时收到的错误消息?
如果没有,还有什么好方法检查它?
【问题讨论】:
-
操作系统不允许您删除作为资源获取到另一个线程的文件。
在 Java 和 C# 中,是否有任何函数可以检查文件是否被使用,例如我们尝试删除已使用的文件时收到的错误消息?
如果没有,还有什么好方法检查它?
【问题讨论】:
通常建议不要检查文件是否正在使用。 没意义。
假设你有以下代码:
if(file is not being used)
open file
即使 if 语句的计算结果为 true ,也不能保证在您尝试打开文件时不会使用该文件。所以,只要对文件做任何你想做的事情,并处理任何可能引发的异常。
【讨论】:
抛出异常的情况只是这种情况的正确和预期行为。
原因来自于 OO 原则。您请求一个对象执行某些操作。如果它不能按预期完成它应该返回它。像 C++ 这样的语言,在异常不流行的情况下,会返回一个错误代码,开发人员应该检查。这很容易出错,因此对于后来的语言,API 设计者已经引入了异常。这使开发人员可以适当地控制代码。
访问资源是一项复杂的任务,需要考虑很多情况,而且总是多方面的情况。
而不是解决文件无法删除和检测的问题。您应该关注在发生这种情况时应该应用的逻辑。
Java 解决方案:
您可以使用Files 和方法delete(java.nio.file.Path)。
当不允许删除文件时,此方法会抛出SecurityException。
或者你可以使用系统SecurityManager
SecurityManager security = System.getSecurityManager();
securty.checkDelete(String file)
如果不允许调用线程删除指定文件,则抛出 SecurityException。
C# 的解决方案:
同样的规则也适用于 C#,System.IO.File.Delete 它会抛出 UnauthorizedAccessException
【讨论】:
首先检查文件是否存在(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)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
【讨论】: