Java File.delete()有时会留下无法访问的文件(Windows) - java

我试图以编程方式从正在运行的(!)系统中清除日志文件,该系统由数个Java和非Java服务器组成。我使用了Java的File.delete()操作,它通常可以正常工作。对于当前未删除的正在使用的日志文件,我也非常满意,因此只要File.delete()返回false时,我就将其记录为警告。

但是,在目前仍由NON-Java应用程序(Postgres,Apache HTTPD等)写入的日志文件中,Java应用程序也可能会受到影响,但我尚未注意到,而且所有程序都使用相同的日志记录框架,似乎没问题)实际上并未删除(这是我所期望的),但是File.delete()为它们返回“ true”。
但是不仅这些文件仍然存在于文件系统上(Windows资源管理器和“ dir”仍显示它们),但之后它们将无法访问...当我尝试使用文本编辑器等打开它们时,我得到“访问被拒绝”或类似的错误消息,当我尝试使用资源管理器复制它们时,它还声称我没有权限,当我用资源管理器检查其“属性”时,它显示了“您无权查看或编辑此对象的权限” ”。

只是要清楚一点:在运行File.delete()操作之前,我可以毫无问题地访问或删除这些文件,而delete操作会“破坏”它们。一旦我停止了应用程序,文件便消失了,然后在重新启动时,应用程序从头开始创建了文件,一切恢复正常。
问题在于,在清除日志文件操作后未重新启动应用程序时,应用程序将记录到必杀技。

此行为使我想起了Linux的文件删除行为:如果删除仍由应用程序保持打开状态的文件,该文件将从文件系统中消失,但是仍保持文件句柄的应用程序将很乐意继续写入该文件,但之后您将永远无法访问它。唯一的区别是,此处文件在FS中仍然可见,但否则无法访问。

我应该提到我的Java程序和应用程序本身都以“系统”用户身份运行。

我还尝试了Files.delete(),据称它抛出IOException指示错误...但是似乎没有错误。

我试图解决此问题的方法是,使用此处https://stackoverflow.com/a/1390669/5837050中所述的方法检查文件当前是否已锁定,但这仅适用于某些文件,不适用于所有文件。

我基本上需要一种可靠的方法(至少对于Windows,如果它也适用于Linux,那会很棒),以确定某个程序是否仍在使用文件,因此我无法删除它。

任何提示表示赞赏。

参考方案

我没有重现它,但似乎是OS预期的行为,通常不同的应用程序由拥有这种文件所有权的不同用户运行,但我知道您希望像主清除Java一样检查未使用的日志文件,删除它们(当然有足够的授权运行)。

因此,考虑到操作系统的行为不会改变,我建议使用“卷文件附加程序”策略配置您的日志,然后检查与这些策略匹配的文件。

检查回滚策略,以了解回滚的概念:
http://logback.qos.ch/manual/appenders.html#onRollingPolicies

例如,如果您的附加程序文件策略为“超过一天或超过1Gb”,则只需删除上次编辑日期早于一天或大小为1Gb的文件。使用此规则,您将确保删除未使用的日志文件。

请注意,使用适当的滚动策略,您甚至可能不需要清除方法,请查看以下配置示例:

  <!-- keep 30 days' worth of history capped at 3GB total size -->
  <maxHistory>30</maxHistory>
  <totalSizeCap>3GB</totalSizeCap>

我希望这可以对您有所帮助!

Java:从文件系统加载资源 - java

我的项目设定我有以下项目设置:\program.jar \images\logo.png 在我的代码中,我使用相对URL "images/logo.png"引用图像。问题如果我在目录中使用以下命令运行此程序:c:\projects\program_dir\bin\>java -jar program.jar 然后一切正常,Java能…

Java:如何读取文本文件的每一行并将每一行设置为数组元素? - java

我正在尝试阅读文本文件每一行中列出的问题,然后将每一行添加到数组中,以便以后可以分别调用它们。我几乎肯定可以用Java来做,但是我不确定如何去做。我确实弄清楚了如何读取整个文本文件并将其全部设置为字符串: private static String readFile(String pathname) { String line = null; try { B…

Java检测文件系统中的更改 - java

我有一个文件夹,其中不断有新文件被转储。在Java中,什么是检测文件系统更改的最佳方法(即,要在其中转储文件的指定文件夹)并将新到达的文件添加到队列数据结构,以便我可以顺序处理每个传入文件。我知道File类中的listFiles()函数,但是使用此函数,我只能获取瞬间可用的文件。当然,我可以连续轮询文件夹并使用线程获取其中的文件列表,但这是最好的方法还是有更…

Java中的多线程 - java

如果我的文件包含4000字节,我可以同时从文件读取4个线程吗?并且每个线程访问文件的不同部分。线程1读取0-999,线程2读取1000-2999,依此类推。请用Java举例。 参考方案 该文件非常小,并且加载速度非常快。我要做的是创建一个加载数据的线程安全数据类。然后,每个处理线程都可以从数据类中请求一个ID,并接收一个唯一的线程,并保证没有其他线程向您的远…

对于Java中的isDirectory和isFile,文件始终返回false - java

为什么file为isFile()方法返回false,即使它是file。当它是目录时,它为isDirectory()返回false。难道我做错了什么?我测试的这些文件/目录不存在,我需要创建它们,所以这就是为什么我要测试使用createFile()还是mkdir()的原因。File file = new File("C:/Users/John/Des…