【问题标题】:Temporary files stays in linux after an attempt to delete尝试删除后临时文件保留在 linux 中
【发布时间】:2017-05-19 21:28:39
【问题描述】:

我正在编写一个 java servlet,它从客户端下载文件并将其移动到某个特定位置。移动后,我删除下载的文件。有时 linux 会创建 .fuse_hidden_​​_____ 命名文件。他们一直呆在那里,直到我重新启动我的服务器进程。下载后我会关闭所有打开的流。它通常发生在已安装的 USB 闪存驱动器上。

这是我的代码 sn-p

    try{
           ...
           inputStream = new RandomAccessFile(new File(sourcePath), "r");
           inputChannel = inputStream.getChannel();
           ....
        }
    finally{
           inputChannel.close(); 
           inputStream .close();
       }
    new File(sourcePath).delete();

【问题讨论】:

  • 您有任何异常吗?如果抛出异常,文件不会被删除,因为该语句在 try、catch、finally 块之外。

标签: java linux fuse


【解决方案1】:

这意味着文件上至少还有一个打开的文件句柄。当最后一个句柄被关闭时,隐藏文件将被删除。

您说当您杀死服务器时它们会消失,因此您的服务器仍然至少有一个打开文件的句柄。您可以使用lsof 命令来证明确实是您的服务器拥有打开的句柄。

非常仔细地检查您是否在成功和异常情况下都关闭了 java 中文件的所有打开流。

【讨论】:

  • 查看下载代码,它有以下几行用于关闭下载的文件:destinationOutputStream.close();目的地OutputStream.flush();这可能是那些 fuse 文件的原因吗,在 close() 之后调用了 flush() 吗?
  • 无法刷新已关闭的流,因此代码本身就是一个问题。修复此逻辑错误后,原来的句柄问题会消失吗?
  • 抱歉回复晚了。似乎该修复已解决了该问题。经过几个小时的测试,还没有看到那些 .fuse 文件。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多