まず、私が持っていることを明記したい
<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() は適切に動作していないようです。