file.delete()不能删除的原因

时间:2021-06-14 20:19:56
大致情况如下:
    项目中需要将用户上传的excel文件解析后删除。
    用户上传完文件提交时会触发一个请求,在方法里我得到上传文件后保存的路径名进行解析,之后删除文件,流程非常简单,只是到了删除的时候却怎么也删除不了文件。
    我以为是流没有关闭的原因,索性把解析的步骤省略,在方法里直接得到文件路径后删除,还是不行。匪夷所思的是我调的file.delete()方法竟然返回true,返回true是删除成功了才返回,这是咋地?
    索性新建了个项目,直接试了下上述的删除方法,正确无误。
    愁死我了,这么个小玩意弄了半天了,望请各位出出招,实在不知道咋整了

18 个解决方案

#1


我来刷分的

#2


在帮你定一下

#3


马克一下 
看代码才能分析啊 

#4


1 你解析的文件流有没有关闭
2 建议直接读取用户上传的数据流,而不是存为文件,再解析;一定要存文件的话,也是用File.createTempFile的方式,即使当时删除失败,也会在系统重启之类的时机被删除

#5


这是因为java自身的机制照成的,虽然file.delete()方法返回true,实际上这个文件可能还存在,手动调用system.gc()之后应该就可以了

#6


引用 4 楼 shine333 的回复:
1 你解析的文件流有没有关闭
2 建议直接读取用户上传的数据流,而不是存为文件,再解析;一定要存文件的话,也是用File.createTempFile的方式,即使当时删除失败,也会在系统重启之类的时机被删除

1 不用流也不能删除
2 用户上传的是excel文件而不是数据流
谢谢,再帮忙想想

#7


引用 5 楼 anly_hz 的回复:
这是因为java自身的机制照成的,虽然file.delete()方法返回true,实际上这个文件可能还存在,手动调用system.gc()之后应该就可以了

这种方法也试过,没效果。请问不用delete()方法还有方法强制删除吗?

#8


1 不用流也不能删除

确认是否有软件占用该文件?

#9


java删除文件注意事项:1.路径上不能出现java认为的非法字符,如“(”,“)”等;

                                  2.确保删除操作之前,文件不再被使用,即文件资源被释放!

#10


搞定了,终于可以删除了,只是在删除时多加了一个getAbsoluteFile()再删除
	
public static void deleteFile(String localFileName) {
//localFileName = localFileName.replace("\\", "/");
File localFile = new File(localFileName);
boolean flag = false;
if(localFile.isFile()&&localFile.exists()){
log.debug("localFile-Path-"+localFile.getPath()+"Ab "+localFile.getAbsolutePath());
log.debug("localFile-File-"+localFile+"Ab "+localFile.getAbsoluteFile());
log.debug("localFileName--"+localFileName);
flag = localFile.getAbsoluteFile().delete();
}
log.debug("文件" + localFileName + "是否删除成功:" + flag);
}

API中关于getAbsoluteFile方法的说明:
public File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。等同于 new File(this.getAbsolutePath())。 
返回:
绝对抽象路径名,它与此抽象路径名表示相同的文件或目录 
抛出: 
SecurityException - 如果无法访问所需的系统属性值。
从以下版本开始: 
1.2 

搞不懂的是我打印的这些字符串竟然都是完全一样的,原来没有加这个方法就不能删除,但是delete方法也返回true。为什么看起来都是一样的绝对路径,不加方法就不能删除呢?
求解释...

#11


引用 6 楼 mywayhome 的回复:
引用 4 楼 shine333 的回复:
1 你解析的文件流有没有关闭
2 建议直接读取用户上传的数据流,而不是存为文件,再解析;一定要存文件的话,也是用File.createTempFile的方式,即使当时删除失败,也会在系统重启之类的时机被删除

1 不用流也不能删除
2 用户上传的是excel文件而不是数据流
谢谢,再帮忙想想

2 你web开发版,上传只可能一种情形,我的意思就是直接获取用户的数据流,而不要保存文件。

#12


呵呵,解决了就好了

祝楼主好运

#13


引用 10 楼 mywayhome 的回复:
搞定了,终于可以删除了,只是在删除时多加了一个getAbsoluteFile()再删除

Java code
    
public static void deleteFile(String localFileName) {
        //localFileName = localFileName.replace("\\", "/");
        File localFi……

 同求解释。

#14


来学习下。上传时可以直接以流的形式获取到,11L是可以的

#15


估计是你的excel被打开的原因

#16


文件删除不了,应该是有其他方法或是软件在引用该文件。
file.delete()是肯定能删除文件的

#17


引用 16 楼 wangjiangbo2 的回复:
文件删除不了,应该是有其他方法或是软件在引用该文件。
file.delete()是肯定能删除文件的

应该是这样的

#18


已经知道原因了,是因为公司的开发平台有文件监控模块,删除文件操作只能是平台操作。所以不能删除文件。

#1


我来刷分的

#2


在帮你定一下

#3


马克一下 
看代码才能分析啊 

#4


1 你解析的文件流有没有关闭
2 建议直接读取用户上传的数据流,而不是存为文件,再解析;一定要存文件的话,也是用File.createTempFile的方式,即使当时删除失败,也会在系统重启之类的时机被删除

#5


这是因为java自身的机制照成的,虽然file.delete()方法返回true,实际上这个文件可能还存在,手动调用system.gc()之后应该就可以了

#6


引用 4 楼 shine333 的回复:
1 你解析的文件流有没有关闭
2 建议直接读取用户上传的数据流,而不是存为文件,再解析;一定要存文件的话,也是用File.createTempFile的方式,即使当时删除失败,也会在系统重启之类的时机被删除

1 不用流也不能删除
2 用户上传的是excel文件而不是数据流
谢谢,再帮忙想想

#7


引用 5 楼 anly_hz 的回复:
这是因为java自身的机制照成的,虽然file.delete()方法返回true,实际上这个文件可能还存在,手动调用system.gc()之后应该就可以了

这种方法也试过,没效果。请问不用delete()方法还有方法强制删除吗?

#8


1 不用流也不能删除

确认是否有软件占用该文件?

#9


java删除文件注意事项:1.路径上不能出现java认为的非法字符,如“(”,“)”等;

                                  2.确保删除操作之前,文件不再被使用,即文件资源被释放!

#10


搞定了,终于可以删除了,只是在删除时多加了一个getAbsoluteFile()再删除
	
public static void deleteFile(String localFileName) {
//localFileName = localFileName.replace("\\", "/");
File localFile = new File(localFileName);
boolean flag = false;
if(localFile.isFile()&&localFile.exists()){
log.debug("localFile-Path-"+localFile.getPath()+"Ab "+localFile.getAbsolutePath());
log.debug("localFile-File-"+localFile+"Ab "+localFile.getAbsoluteFile());
log.debug("localFileName--"+localFileName);
flag = localFile.getAbsoluteFile().delete();
}
log.debug("文件" + localFileName + "是否删除成功:" + flag);
}

API中关于getAbsoluteFile方法的说明:
public File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。等同于 new File(this.getAbsolutePath())。 
返回:
绝对抽象路径名,它与此抽象路径名表示相同的文件或目录 
抛出: 
SecurityException - 如果无法访问所需的系统属性值。
从以下版本开始: 
1.2 

搞不懂的是我打印的这些字符串竟然都是完全一样的,原来没有加这个方法就不能删除,但是delete方法也返回true。为什么看起来都是一样的绝对路径,不加方法就不能删除呢?
求解释...

#11


引用 6 楼 mywayhome 的回复:
引用 4 楼 shine333 的回复:
1 你解析的文件流有没有关闭
2 建议直接读取用户上传的数据流,而不是存为文件,再解析;一定要存文件的话,也是用File.createTempFile的方式,即使当时删除失败,也会在系统重启之类的时机被删除

1 不用流也不能删除
2 用户上传的是excel文件而不是数据流
谢谢,再帮忙想想

2 你web开发版,上传只可能一种情形,我的意思就是直接获取用户的数据流,而不要保存文件。

#12


呵呵,解决了就好了

祝楼主好运

#13


引用 10 楼 mywayhome 的回复:
搞定了,终于可以删除了,只是在删除时多加了一个getAbsoluteFile()再删除

Java code
    
public static void deleteFile(String localFileName) {
        //localFileName = localFileName.replace("\\", "/");
        File localFi……

 同求解释。

#14


来学习下。上传时可以直接以流的形式获取到,11L是可以的

#15


估计是你的excel被打开的原因

#16


文件删除不了,应该是有其他方法或是软件在引用该文件。
file.delete()是肯定能删除文件的

#17


引用 16 楼 wangjiangbo2 的回复:
文件删除不了,应该是有其他方法或是软件在引用该文件。
file.delete()是肯定能删除文件的

应该是这样的

#18


已经知道原因了,是因为公司的开发平台有文件监控模块,删除文件操作只能是平台操作。所以不能删除文件。