Android / Java File.mkdirs()在外部存储不能正常工作

首先,我想指定我有

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

在我的清单中指定,我检查Environment.MEDIA_MOUNTED。

在我看来,真正奇怪的是它返回true,但实际上并不创build目录。

 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()似乎对我来说工作不正常。

你的问题没有提供有关FileNotFoundException更多细节。 检查触发这个的路径。 忘记你认为的路径,记录下来或者通过调试器运行,看看它是什么。

根据没有正确创建的目录,(用你的眼睛)验证这个路径真的是你的想法 。 我看到你已经登录download.getCanonicalPath ,检查你的日志是什么。

最后, Download.download真的在你认为它存储的地方保存了东西? 在你打电话之前,你正在准备和验证一个使用download的目录,但是当你打电话到Download.download ,你并没有使用Download.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);