java:检查文件是否可以在windows下移动

时间:2012-03-19 14:03:08

标签: java windows permissions

我需要重命名文件(将其保存在同一目录中); 我似乎无法找到一种方法来查看我的程序是否具有所需的权限:

Files.isWritable(directory) && Files.isWritable(oldFile);

总是返回true,运行用户是否有权写入文件(我猜他们只检查文件是否为只读,即使这违反了javadoc中规定的合同); 我不是在安全经理下运行所以我不能打电话给

System.getSecurityManager.checkDelete(oldFile.toString());

我需要检查几个文件的重命名是否(可能)成功,所以我不能尝试捕获异常。
有出路吗?显然,便携式解决方案是可爱的,但我会满足于特定于Windows的解决方案......

3 个答案:

答案 0 :(得分:1)

好吧,你不能这样检查Windows ACL。 “原生”解决方案相当容易,因为Windows支持文件系统上的事务。只需调用DeleteFileTransacted,如果任何删除失败,则回滚事务。

如果您没有使用tranactions,那么第二个选项是首先打开具有显式DELETE期望访问权限的句柄(DELETE是标准WinNT访问权限之一),拒绝任何共享。当且仅当这对所有文件都成功时,请使用SetFileInformationByHandle(handle, FileDispositionInfo, &fdiObj, sizeof(fdiObj));

将其全部删除

(后者不是交易,因此可能会出现隔离问题,从而影响原子性)。

答案 1 :(得分:0)

尝试new SecurityManager().checkDelete(oldFile.toString())

答案 2 :(得分:0)

试着移动吧!如果移动失败,您没有权限,或者其他错误。

这是一般原则。不要试图预测未来,猜测即将到来的行动是否会成功。尝试操作。否则你会引入各种额外的问题:

  1. 你可能做错了测试。
  2. 条件可能会在测试和操作之间发生变化。
  3. 操作通常会返回错误或抛出异常,您必须编写代码来处理:为什么要写两次?