在Java和C#中,是否有任何函数可以检查文件是否被使用,比如我们在尝试删除已使用的文件时收到的错误消息?
如果没有,检查它的另一个好方法是什么?
答案 0 :(得分:1)
通常建议不检查文件是否正在使用。 这毫无意义。
假设您有以下代码:
if(file is not being used)
open file
即使if
语句的计算结果为true
,也无法保证在您尝试打开文件时不会使用该文件。因此,只需对文件执行任何操作,并处理可能引发的任何异常。
答案 1 :(得分:0)
抛出异常的情况只是适当的情况和此类情况的预期行为。
其原因来自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
答案 2 :(得分:-1)
首先检查文件是否存在(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;
}