V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
willxiang
V2EX  ›  Java

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

  •  
  •   willxiang · 2019-12-04 16:26:25 +08:00 · 4641 次点击
    这是一个创建于 1576 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知道各位有没有碰到过这种问题,项目在 Linux 或 Mac 上跑的时候有一个删除文件的操作从来没报过错,
    但在 Windows 上跑的时候十次有八次都删除不成功,调试了一下发现 File.delete()返回 false,可是在删除之前并没有发现有任何地方有使用这个文件。

    直接打开目录手动去删除就提示被 java 进程占用……
    第 1 条附言  ·  2019-12-05 10:01:28 +08:00
    总结一下:
    由于之前编译的版本并非官方最新版的代码,
    昨天找到最终出问题的代码块时,google 了一下,发现该 BUG 以被官方在后来的版本中修复了。(我在调试代码时并不知道本地拉取的二次开发的代码是官方的什么版本😅)
    然后单独修改了这部分代码后目前测试已经没有问题了。
    第 2 条附言  ·  2019-12-05 10:03:48 +08:00
    为避免万一有人搜到这个问题,正好又是使用同一个开源项目,正好又跟我情况一样然后没有头绪,
    这里贴一下官方的问题地址:
    https://issues.streamsets.com/browse/SDC-11142
    loqixh
        1
    loqixh  
       2019-12-04 16:32:42 +08:00 via Android   ❤️ 1
    因为 linux 文件正在使用也可以删除,win 不行
    geelaw
        2
    geelaw  
       2019-12-04 16:38:12 +08:00 via iPhone   ❤️ 1
    @loqixh #1 Windows 当然可以,只要打开的时候不要阻止删除即可。

    一个自然的想法是这段 Java 代码之前打开过此文件(且不允许删除)但没有正确关闭。
    willxiang
        3
    willxiang  
    OP
       2019-12-04 16:47:03 +08:00
    谢楼上二位老哥,我再找找原因
    qwerthhusn
        4
    qwerthhusn  
       2019-12-04 16:56:30 +08:00   ❤️ 1
    程序中出现了未正确关闭的流吧
    xomix
        5
    xomix  
       2019-12-04 17:22:03 +08:00
    unix 文件没有独占模式阻断删除的,所以可以直接删除,Windows 下为了稳定性等问题考虑在你读取文件的时候也可以加独占模式独占文件阻断删除,那肯定是你代码中文件打开方式不对( java 调用 winapi )或者打开后没有关闭文件
    Kimipoker
        6
    Kimipoker  
       2019-12-04 17:41:42 +08:00
    注意下 是不是没有用那个文件打开过流 要关了 . 我之前就是这样. 用 try(OutputStream steram =....) {}这种操作,finally 里面写删除看看
    wangxiaoaer
        7
    wangxiaoaer  
       2019-12-04 17:44:49 +08:00 via Android
    没准是杀软在后台扫描?
    hezhuohua
        8
    hezhuohua  
       2019-12-04 18:59:00 +08:00
    win 上的 delete 如果还有子文件或子文件夹是删不掉的,但 linux 可以,所以 win 上你要递归删
    evilhero
        9
    evilhero  
       2019-12-04 19:01:52 +08:00 via Android
    我记得好像和回收站有关系,以前遇到过,忘了
    mmdsun
        10
    mmdsun  
       2019-12-04 19:04:38 +08:00 via Android
    怀疑路径不对。
    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
        11
    kawowa  
       2019-12-04 19:07:34 +08:00 via Android
    可以用\\\\代替\来试试
    willxiang
        12
    willxiang  
    OP
       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
        13
    chengquan223  
       2019-12-05 13:46:28 +08:00
    我一看头像就知道是你。。。
    willxiang
        14
    willxiang  
    OP
       2019-12-05 14:31:46 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   951 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:18 · PVG 05:18 · LAX 14:18 · JFK 17:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.