同一份代码, Java File.delete(), Linux 跟 Mac OS 上都能正常删除, Windows 上老删除失败

2019-12-04 16:26:25 +08:00
 willxiang
不知道各位有没有碰到过这种问题,项目在 Linux 或 Mac 上跑的时候有一个删除文件的操作从来没报过错,
但在 Windows 上跑的时候十次有八次都删除不成功,调试了一下发现 File.delete()返回 false,可是在删除之前并没有发现有任何地方有使用这个文件。

直接打开目录手动去删除就提示被 java 进程占用……
4909 次点击
所在节点    Java
14 条回复
loqixh
2019-12-04 16:32:42 +08:00
因为 linux 文件正在使用也可以删除,win 不行
geelaw
2019-12-04 16:38:12 +08:00
@loqixh #1 Windows 当然可以,只要打开的时候不要阻止删除即可。

一个自然的想法是这段 Java 代码之前打开过此文件(且不允许删除)但没有正确关闭。
willxiang
2019-12-04 16:47:03 +08:00
谢楼上二位老哥,我再找找原因
qwerthhusn
2019-12-04 16:56:30 +08:00
程序中出现了未正确关闭的流吧
xomix
2019-12-04 17:22:03 +08:00
unix 文件没有独占模式阻断删除的,所以可以直接删除,Windows 下为了稳定性等问题考虑在你读取文件的时候也可以加独占模式独占文件阻断删除,那肯定是你代码中文件打开方式不对( java 调用 winapi )或者打开后没有关闭文件
Kimipoker
2019-12-04 17:41:42 +08:00
注意下 是不是没有用那个文件打开过流 要关了 . 我之前就是这样. 用 try(OutputStream steram =....) {}这种操作,finally 里面写删除看看
wangxiaoaer
2019-12-04 17:44:49 +08:00
没准是杀软在后台扫描?
hezhuohua
2019-12-04 18:59:00 +08:00
win 上的 delete 如果还有子文件或子文件夹是删不掉的,但 linux 可以,所以 win 上你要递归删
evilhero
2019-12-04 19:01:52 +08:00
我记得好像和回收站有关系,以前遇到过,忘了
mmdsun
2019-12-04 19:04:38 +08:00
怀疑路径不对。
1.是否转化了正确的路径?比如使用了 File.separator。
2.当 Java 代码删除失败的时候,可以把路径打印出来吗?
3.删除失败的时候,用 Windows 电脑右键直接删除可以成功吗?

你可以在 Windows 上打开“资源监视器”窗口中,依次点击“cpu”——>“关联的句柄”搜索你删除失败的文件看看文件是否被某些进程占用。

这里有一个强制删除的代码适用于 Linux,Windows,MacOS 等:
https : //github.com/classgraph/classgraph/blob/master/src/main/java/nonapi/io/github/classgraph/ utils / FileUtils.java # L606 清理完后 ByteBuffer,您可以删除文件。但是,请确保 ByteBuffer 在清理后再也不使用它,否则 JVM 将崩溃。
kawowa
2019-12-04 19:07:34 +08:00
可以用\\\\代替\来试试
willxiang
2019-12-04 19:37:27 +08:00
@qwerthhusn #4
@xomix #5
@Kimipoker #6
@wangxiaoaer #7
@hezhuohua #8
@evilhero #9
@mmdsun #10
@kawowa #11

感谢楼上各位大佬的回复,问题还未解决但已经定位到一个大概范围了。
项目是在某开源项目上二次开发的,而我是下午才从仓库拉下来的,还不太熟悉这一块具体的功能代码,
目前大概确定应该是某个地方开了流但可能没有正确的 close()掉,
因为我测试时创建的文件(会生成 2 个 json ),一创建完成后,a.json 就能正常删除,b.json 就直接被占用了(问题就出在 b.json 上)
删除是使用的递归方式,排除子文件或者文件夹的问题。
应该在加会儿班就能解决
chengquan223
2019-12-05 13:46:28 +08:00
我一看头像就知道是你。。。
willxiang
2019-12-05 14:31:46 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/625925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX