我需要重命名文件(将其保存在同一目录中); 我似乎无法找到一种方法来查看我的程序是否具有所需的权限:
Files.isWritable(directory) && Files.isWritable(oldFile);
总是返回true,运行用户是否有权写入文件(我猜他们只检查文件是否为只读,即使这违反了javadoc中规定的合同); 我不是在安全经理下运行所以我不能打电话给
System.getSecurityManager.checkDelete(oldFile.toString());
我需要检查几个文件的重命名是否(可能)成功,所以我不能尝试捕获异常。
有出路吗?显然,便携式解决方案是可爱的,但我会满足于特定于Windows的解决方案......
答案 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)
试着移动吧!如果移动失败,您没有权限,或者其他错误。
这是一般原则。不要试图预测未来,猜测即将到来的行动是否会成功。尝试操作。否则你会引入各种额外的问题: