【问题标题】:java mkdirs did not work well (on Android platform)java mkdirs 不能正常工作(在 Android 平台上)
【发布时间】:2016-03-11 16:58:24
【问题描述】:

File.mkdirs(). 有问题

[我的测试代码]

public boolean makeFolder(Context context, String path){
    if(path == null || context == null)
       return false;

    File itemPath = new File(path);
    if(itemPath.isDirectory())
        return true; //happy time1 : because already exist.

    if(itemPath.mkdirs())
        return true; //happy time2 : because It's is goal.

    //now we have trouble.
    //itemPath is not directory and can not make that folder.
    //is itemPath one of files? ok find it out.

    // first of all, check a paranet folder path.
    File parent = itempath.getParentFile();
    if(parent == null) 
        return false;

    if(parent.isDirectory()){
        if(itemPath.isFile()){
            if(itemPath.delete() == false){
                return false;
            }
        }else{
            //This is the spot where I stocked.
            sendDownloadErrorLog("failed!!");
            return false;  //check point!!!
        }
    }else{
        return false;// parent is't folder!! How I can handle this!
    }
    //once more try make folder (because we try to delete same name file
    return itemPath.mkdirs();
}

我在下载一些文件之前制作文件夹时使用了此代码。 这段代码真的很好用,但不是每次都有效。 很少有人报告我在那个地方“失败”了! (检查点!)

  1. 我检查了 dest 文件夹是否存在。
  2. 我尝试创建 dest 文件夹。
  3. 我检查了 dest 的父级类型(文件夹与否)
  4. 我尝试删除与 dest 文件夹同名的文件。 (如果存在)
  5. 最后,再次尝试创建一个 dest 文件夹。

但有时第 4 步会失败。 itemPath(dest 文件夹) 不存在。 itemPath 无法弥补。 itemPath 的父级存在,她是文件夹。 没有与 itemPath 同名的文件。 那么为什么 File.mkdirs 不能制作 destFolder?

有什么逻辑漏洞吗?

请告诉我。

【问题讨论】:

标签: java android file mkdirs


【解决方案1】:
if(itemPath.isDirectory())
    return true; //happy time1 : because already exist.

好的

if(itemPath.mkdirs())
    return true; //happy time2 : because It's is goal.

好的

//now we have trouble.
//itemPath is not directory and can not make that folder.

这可能意味着几件事:

  1. 这是一个文件。
  2. 您没有父目录的写入权限。
  3. 父级不是目录。

所以:

if(parent.isDirectory()){
    if(itemPath.isFile()){
        if(itemPath.delete() == false){
            return false;

在这种情况下,item 是一个文件,parent 是一个目录,而您没有对该文件或目录的写入权限。

        }
    }else{
        //This is the spot where I stocked.

此时,父目录是目录,项目不是文件,所以它不存在,并且您在上面创建失败,因此您可能没有对父目录的写入权限。

        sendDownloadErrorLog("failed!!");
        return false;  //check point!!!
    }
}else{
    return false;// parent is't folder!! How I can handle this!

你不能也不应该处理这个。这是用户错误或配置问题。无需尝试编写代码。

//once more try make folder (because we try to delete same name file
return itemPath.mkdirs();

我会说你过于复杂了。如果您应该创建一个目录,但由于该名称的文件已经存在而无法创建,则可能是用户的错误。告诉他。您不应该通过删除文件来做出反应,它的存在与您无关。同样,如果您没有写访问权限,那就结束了。你无能为力。我会将整个事情简化为:

return itemPath.mkdirs();

【讨论】:

  • 感谢您的回答。
  • 你说与我无关的那部分是防御性代码。 1.我们得到了“mnt/android/data/com.test.mine/parent/dest”。 2.用户尝试删除该文件夹 3.但由于某种原因失败。 (例如,android 将文件保存在 dest 文件夹等中)。 4.在那种失败之后,有时android会制作僵尸文件夹。(目标文件夹转向它)它不是文件夹。 5.用户尝试下载相同的文件(相同的文件将下载相同的文件夹) 6.但是有僵尸 7.所以我们尝试删除与dest文件夹同名的东西。这是我的目的。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多