1

まず、私が持っていることを明記したい

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

マニフェストで指定されており、Environment.MEDIA_MOUNTED を確認します。

私の意見では、これについて本当に奇妙なことは、true を返しますが、実際にはディレクトリを作成しないことです。

public static void downloadFiles(ArrayList<FileList> list) {

    for (FileList file: list) {
        try {
            // This will be the download directory
            File download = new File(downloadDirPatch.getCanonicalPath(), file.getPath());

            // downloadDirPatch is defined as follows in a different class:
            //
            // private static String updateDir = "CognitionUpdate";
            // private static File sdcard = Environment.getExternalStorageDirectory();
            // final public static File downloadDir = new File(sdcard, updateDir);
            // final public static File downloadDirPatch = new File(downloadDir, "patch");
            // final public static File downloadDirFile = new File(downloadDir, "file");

            if (DEV_MODE)
                Log.i(TAG, "Download file: " + download.getCanonicalPath());

            // Check if the directory already exists or not
            if (!download.exists())
                // The directory doesn't exist, so attempt to create it
                if (download.mkdirs()) {
                    // Directory created successfully
                    Download.download(new URL(file.getUrl() + file.getPatch()), file.getPath(), file.getName(), true);
                } else {
                    throw new ExternalStorageSetupFailedException("Download sub-directories could not be created");
                }
            else {
                // Directory already exists
                Download.download(new URL(file.getUrl() + file.getPatch()), file.getPath(), file.getName(), true);
            }
        } catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        } catch (ExternalStorageSetupFailedException essfe) {
            essfe.printStackTrace();
        }
    }
}

「if (download.mkdirs())」は true を返しますが、アプリが実際にファイルをダウンロードしようとすると、

FileNotFoundException: open failed: ENOENT (No such file or directory)

例外で、後で電話でディレクトリを確認すると、ディレクトリは存在しません。

プログラムの早い段階で、アプリは親ダウンロード ディレクトリを設定し、File.mkdir() を使用してすべて正常に動作しますが、File.mkdirs() は適切に動作していないようです。

4

1 に答える 1

2

あなたの質問は、 についてあまり詳しく説明していませんFileNotFoundException。これをトリガーするパスを確認してください。パスが何であるか忘れて、ログに記録するか、デバッガーで実行して、実際のパスを確認してください。

正しく作成されていないディレクトリに従って、パスが本当にあなたが考えているものであることを(あなたの目で)確認してください。すでにログdownload.getCanonicalPathを記録しているようです。実際のログを確認してください。

最後に、Download.download本当に保存していると思う場所に保存していますか? それを呼び出す前に、 を使用してディレクトリを準備および検証していますが、呼び出したときに をdownload使用していないため、判断することは不可能です。downloadDownload.download

ところで、繰り返さないでください。Download.download行を繰り返さずに書き直すことができます。

        if (!download.exists())
            if (!download.mkdirs()) {
                throw new ExternalStorageSetupFailedException("Download sub-directories could not be created");
            }
        }
        Download.download(new URL(file.getUrl() + file.getPatch()), file.getPath(), file.getName(), true);
于 2013-05-19T05:50:49.187 に答える