【问题标题】:java: check if a file can be moved under windowsjava: 检查文件是否可以在windows下移动
【发布时间】:2012-04-04 00:32:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这可能会对你有所帮助。[stackoverflow.com/questions/736859/…
  • 好吧,对于“可能”,我认为 canWrite()- 和 exists()- 和 isDirectory()- (和类似的)方法就足够了。如果你想重命名我会推荐一个try-catch-block,因为对于IO我总是使用一个try-catch-block(有很多事情可能出错)......使用你的确切代码,它会不过更容易给出更准确的答案。
  • @AnanthaKrishnan 我会避免调用本地方法来检查我是否可以写入文件,这似乎相当迟钝......
  • @ALexS 我想旧的 IO api 会产生与新的相同的结果,所以 path.toFile().canWrite() 应该返回 true,如果 Files.isWritable(path) 返回 true。 ..

标签: java windows permissions


【解决方案1】:

嗯,你不能这样检查 Windows ACL。 “本机”解决方案相当简单,因为 Windows 支持文件系统上的事务。只要调用DeleteFileTransacted,如果有任何删除失败,就回滚事务。

如果您不使用事务,则第二个选项是首先打开具有明确的DELETE 所需访问权限的句柄(DELETE 是标准 WinNT 访问权限之一),拒绝任何共享。当且仅当所有文件都成功时,使用SetFileInformationByHandle(handle, FileDispositionInfo, &fdiObj, sizeof(fdiObj)); 将它们全部删除

(后者不是事务,因此可能存在隔离问题,进而影响原子性)。

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

    试着移动它!如果移动失败,则说明您没有权限,或者出现其他问题。

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

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

    【讨论】:

    • 因为正如我在问题中所写的那样“我需要检查几个文件的重命名是否会(可能)成功,所以我不能只是尝试捕获异常。”我需要某种事务完整性,分布在文件系统操作和数据库更新上。它不需要(也不可能,可能)有真正的 ACID 保证,但是当事情一定会出错时(即因为你没有文件系统的写权限)的预先警告将是有序的。
    猜你喜欢
    • 2012-09-29
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2013-06-23
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多