Android 中File.delete()无法正常删除文件夹

项目中有个需求,用户通过本地或者手机拍照把多张图片截图并存储在本地文件夹FilePhoto,当用户执行完上传操作后就把FilePhoto文件夹下所有图片删除掉,刚开始代码是这样写的:

    public static boolean DelFilePhoto() {
        String rootPathSD = Environment.getExternalStorageDirectory().getPath();
        File file = new File(rootPathSD + "/FilePhoto");
        if (file.exists()) {
            return file.delete();
        }
        return false;
    }

因为FilePhoto是存储在SDcard中的,所以先获取rootPathSD路径,再加文件名称来获取该文件的根路径,通过这个根路径得到FilePhoto文件夹的File对象,使用file.exists()来判断文件是否存在,存在则通过file.delete()删除它,file.delete()如果删除成功则返回true,不成功则返回false。
程序看来起来一切都很正常,调用该方法时file.delete()返回的也是true,但是文件夹就是删除不掉,这是为何?
一般调用file.delete()方法不能正常删除的原因主要如下几点:

1、当前操作的File文件正在被其它进程引用
2、File文件是个文件夹且不为空,里面含有其它文件或文件夹
3、之前使用了这个File文件的文件流,并且没有关闭此File文件的文件流

经过检查,我的问题属于第二个原因,解决思路为:获取FilePhoto文件夹中的所有文件,得到它们的路径,再一个一个的删除掉。

    public static void DelFilePhoto() {
        String rootPathSD = Environment.getExternalStorageDirectory().getPath();
        File file = new File(rootPathSD + "/FilePhoto");
        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()){
                File photoFile = new File(files[i].getPath());
                Log.d("photoPath -->> ", photoFile.getPath());
                photoFile.delete();
            }
        }
    }

通过File.listFiles()方法可以获得FilePhoto文件夹下所有文件和文件夹,并返回一个File[]数组,由于我这里可以确定FilePhoto文件夹下只会存在文件,没有文件夹,所以只使用files[i].isFile()进行判断,如果是文件,则通过调用getPath()方法取得该文件的绝对路径,再根据得到的绝对路径获得File对象,最后调用delete()方法删除即可。
注意不能在代码中这么写:

    ...
            if (files[i].isFile()){
                File photoFile = new File(files[i].getPath());
                Log.d("photoPath -->> ", photoFile.getPath());
                return photoFile.delete();
            }
    ...

这样写的话执行一次就跳出循环和方法了,这样删除不了所有文件。

如果文件夹中还存在文件夹且不为空怎么办呢?可以使用files[i].isDirectory()判断一下文件是否为文件夹,是文件夹的话则再通过同样的方法把里面的文件遍历一遍删除掉。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值