【问题标题】:Java 7 file deletion in Windows 7Windows 7 中的 Java 7 文件删除
【发布时间】:2013-02-05 10:36:24
【问题描述】:
    Path path = Paths.get("D:/tmp/a/aa/aaa");
    Files.delete(path);
    path = Paths.get("D:/tmp/a/aa");
    Files.delete(path);

这是我得到的例外:

Exception in thread "main" java.nio.file.DirectoryNotEmptyException: D:\tmp\a\aa
  at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:264)
  at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
  at java.nio.file.Files.delete(Files.java:1077)
  at test.Test.main(Test.java:44)

虽然aa 文件夹内没有文件/文件夹。

当我使用 Windows 资源管理器访问文件夹(此处为 aa)并移动到 D:\ 根目录时,观察到此行为。

如果我关闭资源管理器寡妇,这个程序运行正常。

我知道 windows 有时会锁定文件夹,即使在这种情况下异常消息 java.nio.file.DirectoryNotEmptyException: D:\tmp\a\aa 似乎是错误的

【问题讨论】:

  • 你检查过那个文件夹里有没有隐藏文件吗?
  • If i close the explorer widow, this program is working fine. Explorer 可能正在锁定目录。随意向 oracle 提出关于该消息的错误报告。值得一提的是,Java 不识别任何 FS 锁定,因为它主要独立于操作系统。
  • @Hbcdev 没有隐藏文件/文件夹

标签: java windows-7


【解决方案1】:

是的,错误消息是错误的,但 Windows 不会让文件或文件夹被删除,因为另一个进程打开了一个句柄。这无法从 Java 中修复。

【讨论】:

    【解决方案2】:

    另一个提示,使用“/”而不是“\\”,因为 Java 应该是独立于平台的,而“/”在 linux 和 windows 上都可以识别。

    【讨论】:

    • 或者,更好的是,使用File.separator 来获取当前系统的正确字符
    • 至少自从上个千年的 Windows NT 起,Windows 就可以很好地理解(大多数)路径名中的 /。 20 年后仍然有人写双反斜杠 - 丑陋!
    • @Wizardfan 这应该是评论,而不是回答