Java - FileNotFoundException:/ mnt / sdcard:open failed:EISDIR(是一个目录)

时间:2015-10-03 10:23:40

标签: java android

我试图从SD卡解压缩我的Android设备上的RAR存档但是我收到了错误:

 java.io.FileNotFoundException: /mnt/sdcard: open failed: EISDIR (Is a directory)

我选择了一个rar文件并尝试在我的SD卡中解压缩。 错误说它不是目录,但确实如此。我不知道如何解决它。

我的代码:

public static void unrar(File srcRarFile, String destPath, String password) throws IOException {
    if (null == srcRarFile || !srcRarFile.exists()) {
        throw new IOException(".");
    }
    if (!destPath.endsWith(SEPARATOR)) {
        destPath += SEPARATOR;
    }
    Archive archive = null;
    OutputStream unOut = null;
    try {
        archive = new Archive(srcRarFile, password, false);
        FileHeader fileHeader = archive.nextFileHeader();

        while(null != fileHeader) {
            if (!fileHeader.isDirectory())
            {
                // 1  destDirName  destFileName
                String destFileName = "";
                String destDirName = "";

                destFileName = (destPath + fileHeader.getFileNameW()).replaceAll("/", "\\\\");
                destDirName = destFileName.substring(0, destFileName.lastIndexOf("\\"));

                // 2


                File dir = new File(destDirName);
                if (!dir.exists() || !dir.isDirectory()) {
                    dir.mkdirs();
                }
                //


                // ERROR:
                unOut = new FileOutputStream(dir);

                archive.extractFile(fileHeader, unOut);

                unOut.flush();
                unOut.close();
            }
            fileHeader = archive.nextFileHeader();
        }
        archive.close();
    } catch (RarException e) {
        e.printStackTrace();
    } finally {
        IOUtils.closeQuietly(unOut);
    }
}

2 个答案:

答案 0 :(得分:3)

清楚的事情。首先创建目录/mnt/sdcard(变量dir等于代码中的destDirName),然后尝试创建一个相同的文件。这不行。使用类似/mnt/sdcard/abc.rar的名称,它可能会起作用。以下是创建相应File对象的方法:

File file = new File(dir, "abc.rar");

顺便说一下:由于缺少权限,创建一个名为/mnt/sdcard的目录可能无法正常工作。如果它是SD卡,Android无论如何都会为你完成这项工作。如果它不是SD卡,那么创建一个具有此名称的目录不是一个好主意。

PS2:在进一步检查你的代码之后,我看到了不好的风格:

  1. 您正在使用separater变量和indexOf / substring来查找父目录。
  2. 将“/”(android路径分隔符)替换为“\”,仅用于Windows
  3. 您可以在Filestring
  4. 之间进行切换

    您可以使用File.getParent() / File.getParentFile()

    轻松完成所有这些操作

答案 1 :(得分:0)

检查您是否在清单文件中设置了权限。

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