【发布时间】:2016-07-08 13:25:16
【问题描述】:
我正在尝试以编程方式从包含多个 Java 和非 Java 服务器的运行(!)系统中清除日志文件。我使用了 Java 的 File.delete() 操作,它通常工作正常。我对当前正在使用的日志文件没有被删除也很好,所以只要 File.delete() 返回 false,我就将其记录为警告。
但是,在当前仍由非 Java 应用程序(Postgres、Apache HTTPD 等)写入的日志文件中,Java 应用程序也可能会受到影响,但我还没有注意到,并且所有应用程序都使用相同的日志记录无论如何框架,这似乎没问题)实际上并没有被删除(这是我所期望的),但是, File.delete() 为它们返回“true”。 但这些文件不仅仍然存在于文件系统上(Windows 资源管理器和“dir”仍然显示它们),而且之后它们无法访问......当我尝试使用文本编辑器等打开它们时,我得到“访问被拒绝”或类似的错误消息,当我尝试使用资源管理器复制它们时,它还声称我没有权限,当我使用资源管理器检查其“属性”时,它给了我“您无权查看或编辑此对象的权限”。
明确一点:在我运行 File.delete() 操作之前,我可以毫无问题地访问或删除这些文件,删除操作会“破坏”它们。一旦我停止应用程序,文件就会消失,重新启动时,应用程序会从头开始创建它,一切都恢复正常。 问题是在日志文件清除操作后没有重新启动应用程序时,应用程序会记录到 nirvana。
这个行为让我想起了 Linux 的文件删除行为:如果你删除一个仍然被应用程序打开的文件,它会从文件系统中消失,但是应用程序——仍然持有一个文件句柄——会很高兴继续写入该文件,但之后您将永远无法访问它。唯一的区别是这里的文件在 FS 中仍然可见,但在其他情况下也无法访问。
我应该提到我的 Java 程序和应用程序本身都是以“系统”用户运行的。
我还尝试了 Files.delete(),据称它会引发一个 IOException 指示错误...但似乎没有错误。
我试图解决这个问题的方法是检查文件当前是否被锁定,使用这里描述的方法https://stackoverflow.com/a/1390669/5837050,但这仅适用于部分文件,不适用于所有文件。
我基本上需要一种可靠的方法(至少对于 Windows,如果它也适用于 Linux,那就太好了)来确定某个文件是否仍在被某个程序使用,所以我不能删除它。
任何提示表示赞赏。
【问题讨论】:
-
@Divyesh:您发布的链接介绍了一般 Java 并发功能 - 不确定它们在这里应该如何提供帮助,因为我要删除的文件实际上甚至不是由我自己的 Java 应用程序编写的,而是由各种第三方 Java 和非 Java 应用程序。
标签: java file delete-file