来自安卓内部存储的file.delete()返回false。

9
我有一种方法可以从URL下载图像并将其保存在内部存储器的文件夹中。
 public void saveDynamicImage(String url,String fileName, String folderName) {

    InputStream iStream;

    BufferedInputStream buffInputStream;
    ByteArrayBuffer byteArray = null;

    try {
        HttpGet httpGet = new HttpGet(url);
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse httpResponse = httpClient.execute(httpGet);
        iStream = httpResponse.getEntity().getContent();

        buffInputStream = new BufferedInputStream(iStream, 8 * 1024);
        byteArray = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = buffInputStream.read()) != -1) {
            byteArray.append((byte) current);
        } 

    } catch (ClientProtocolException e1) {
    } catch (IOException e1) {
    }

    File dynamicImageDir = context.getDir(AppConstants.DYNAMIC_IMAGE, Context.MODE_PRIVATE);
    File appNamefileDir = new File(dynamicImageDir, BaseActivity.appDataStore.getAppName());
    appNamefileDir.mkdirs();
    File controlNameDir = new File(appNamefileDir, folderName);
    controlNameDir.mkdirs();
    File file = new File(controlNameDir, fileName);

    try {
        FileOutputStream outputStream = new FileOutputStream(file);
        outputStream.write(byteArray.toByteArray());
        outputStream.close();
        System.out.println("DynamicImage saving over!..");
    } catch (FileNotFoundException e) {
    } catch (IOException e) {
    }
}

我希望在某个时间点删除整个目录。我的方法是

rm -r directory_path

该命令将递归地删除指定目录及其所有内容,因此请小心使用。

public void deleteDynamicImage() throws NullPointerException,FileNotFoundException {
    File rootDirectory = context.getDir(AppConstants.DYNAMIC_IMAGE, Context.MODE_WORLD_WRITEABLE);
    boolean status = rootDirectory.delete();
    Log.e("", "delete : "+status);

}

我得到的状态是“false”。文件已创建并且工作正常,唯一的问题在于删除。我是否漏掉了什么东西?

4个回答

28

您的文件是一个文件夹吗?

如果是,您需要先删除该文件夹中的文件
此代码可以正常工作

public void deleteDirectory(File file) {
    if( file.exists() ) {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for(int i=0; i<files.length; i++) {
                if(files[i].isDirectory()) {
                    deleteDirectory(files[i]);
                }
                else {
                    files[i].delete();
                }
            }
        }
            file.delete();
    }
}

非常感谢。这个方法对我很有效。非常好的实现。非常感谢。 - Arundas K V
感谢您提供的工作方法!这就是我对Android开发的困扰,SDK中有很多怪癖,本应该正常工作的功能却不能正常运行。如果File对象支持目录,那么所有方法都应该同时支持文件和目录——这是糟糕的类设计的明显证据。 - AlexVPerl
功能正常,但如果每次激活200个条目,速度会变慢吗? - user3402040

6

要删除目录,请使用以下命令:

public void DeleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) for (File child : fileOrDirectory.listFiles())
    DeleteRecursive(child);
    fileOrDirectory.delete();
}

谢谢您的回答,但我将接受第一个收到的答案作为被采纳的答案。非常感谢。 - Arundas K V
你用什么代码实现的,只是好奇:P - Vikas Rathod
两个代码都能正常工作,但是'henry4343'的代码中加入了检查文件/目录是否存在的逻辑。由于我有各种子文件夹和嵌套文件,所以我采用了那位用户的答案。谢谢.. :) - Arundas K V
运行良好,似乎速度很快。 - user3402040

4

如何在安卓设备上删除文件:

public void deleteFile(String filePath){
    if(filePath.startsWith("content://")){
        ContentResolver contentResolver = getActivity().getContentResolver();
        contentResolver.delete(Uri.parse(filePath), null, null);
    }else {
        File file = new File(filePath);
        if(file.exists()) {
            if (file.delete()) {
                Log.e(TAG, "File deleted.");
            }else {
                Log.e(TAG, "Failed to delete file!");
            }
        }else {
            Log.e(TAG, "File not exist!"); 
        }
    }
}

重要提示: 如果您从Uri获取文件路径,请勿使用Uri.toString()作为它将返回以file:///格式的文件路径,在这种情况下,new File(filePath)将无法工作。因此,始终使用Uri.getPath()来获取文件路径。


3

你正在尝试删除一个目录。只有当该目录为空时,File.delete()才能在目录上工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接