【问题标题】:Java - FileNotFoundException: /mnt/sdcard: open failed: EISDIR (Is a directory)Java - FileNotFoundException:/mnt/sdcard:打开失败:EISDIR(是一个目录)
【发布时间】:2016-01-11 19:56:21
【问题描述】:

我正在尝试从 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);
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

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

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

    顺便说一句:创建一个名为/mnt/sdcard 的目录可能由于缺少权限而无法工作。如果是 SD 卡,Android 无论如何都会为您完成这项工作。如果不是 SD 卡,则使用此名称创建目录不是一个好主意。

    PS2:在进一步查看您的代码后,我发现有些东西风格不好:

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

    您可以使用File.getParent()/File.getParentFile()轻松摆脱这一切

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        相关资源
        最近更新 更多