我试图从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);
}
}
答案 0 :(得分:3)
清楚的事情。首先创建目录/mnt/sdcard
(变量dir
等于代码中的destDirName
),然后尝试创建一个相同的文件。这不行。使用类似/mnt/sdcard/abc.rar
的名称,它可能会起作用。以下是创建相应File对象的方法:
File file = new File(dir, "abc.rar");
顺便说一下:由于缺少权限,创建一个名为/mnt/sdcard
的目录可能无法正常工作。如果它是SD卡,Android无论如何都会为你完成这项工作。如果它不是SD卡,那么创建一个具有此名称的目录不是一个好主意。
PS2:在进一步检查你的代码之后,我看到了不好的风格:
indexOf
/ substring
来查找父目录。File
和string
您可以使用File.getParent()
/ File.getParentFile()
答案 1 :(得分:0)
检查您是否在清单文件中设置了权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />