java 如何判断文件没有被别的程序使用 - 压缩该文件

葬天尘
  • 265

服务器上有 sqlserver,会定时备份数据库,我想要做一个 java 的后台程序监控指定的文件夹的变动当有新文件出现时就压缩该文件。但是 sqlserver 备份要花时间,会不会出现这样的情况,当 sqlserver 刚开始备份,java 检测到目录下出现了新文件就开始压缩,但此时数据还没有备份完成,java 就执行压缩操作应该会报错。首先会不会有这种情况(如果 java 监控目录的功能是当文件被其他程序释放后才会发现新文件则不会有这种情况)?如果有要如何处理?

回复
阅读 818
5 个回答
鸿则
  • 2.4k

我觉得监听文件的思路行不通,应该看看备份程序有没有hook或者用shell封装一下备份程序。


有一个方法:

  1. 读取文件内容,然后检查最后一行。
  2. 正常情况下,dump备份最后一行是固定的,sqlserver我不太清楚,但是mysql的dump是

    -- Dump completed on 2022-07-04  9:03:13
  3. 判断最后一行是否是结束的标志

重命名是不是会报错,如果有其他程序正在使用该文件。
另外用shell是不是更好,shell应该有具体的命令判断是否被占用.

如果对压缩文件的及时性要求没有那么高的话,可以换种思路来解决

当监控到新文件时,在时间点A获取该新文件大小,并睡眠N秒后,在时间点A+N再次获取该文件大小,判断文件大小是否发生改变,如果是则说明文件还在写,则继续睡眠N秒,在时间点A+2N再次判断文件大小是否发生改变,如此循环。当某个时间点与上一个时间点获取到的文件大小没有发生改变时,可以说明该文件已经写完成

删除该文件, 能删除成功就没有被占用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏