-1

問題があります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 を作成できないのでしょうか?

論理的な穴はありますか?

私にお知らせください。

4

1 に答える 1

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();
于 2015-12-07T06:46:05.157 に答える