我的源代码中有一个用于处理目录路径和文件名的方法。 有些路径和文件名偶尔会用'''或'ñ'字符写。
问题是具有该特殊字符的目录路径不被识别为目录并被识别为文件。 我偶尔需要读取文件扩展名,当文件具有该字符时,代码不起作用且不会达到de extension。
public static void listarDirectorio(File f, String separador) {
File[] ficheros = f.listFiles();
File ficheroTratado = null;
logM.escribeLog(separador + "Ruta listada: " + f.getName(), false);
for (int x = 0; x < ficheros.length; x++) {
ficheroTratado = null;
ficheroTratado = ficheros[x];
if (!ficheros[x].isDirectory()) {
if (esBorrable(ficheroTratado.getName())) {
// logM.escribeLog(
// "Fichero borrado: " + ficheroTratado.getName(),
// true);
}
}
if (ficheros[x].isDirectory()
&& !ficheros[x].getName().startsWith("@")) {
String nuevo_separador;
nuevo_separador = separador + " # ";
listarDirectorio(ficheros[x], nuevo_separador);
}
}
}
public static boolean esBorrable(String nFichero) {
boolean esBorrable = false;
try {
String extension = "";
int extIndex = nFichero.lastIndexOf(".");
String ruta = "";
//logM.escribeLog("nombre de fichero: " + nFichero, false);
extension = nFichero.substring(extIndex, extIndex + 4);
//logM.escribeLog("extension que tengo: " + extension, false);
for (int i = 0; i < instance.getArrayExtensiones().size(); i++) {
ruta = "";
ruta = instance.getArrayExtensiones().get(i);
if (ruta.equalsIgnoreCase(extension)) {
//( logM.escribeLog("Este es borrable", false);
esBorrable = true;
} else {
esBorrable = false;
}
}
} catch (Exception e) {
logM.escribeLog("Problema al tratar el fichero: " + nFichero, false);
e.printStackTrace();
return false;
}
return esBorrable;
}
我希望你能帮我解决这个问题。
答案 0 :(得分:1)
好的,我已经复制了你的问题,但它花了一些时间!当locale或file.encoding与文件名的编码不匹配时,会出现此问题。请记住,在Linux中,文件系统名称只是一个8位字符串,并且没有强制编码。
要复制:
mkdir dirñ
来完成。<强>解决方案强>
据了解,这是一个已知的错误,但唯一的解决方案是使用Java 7的NIO2实现:http://jcp.org/en/jsr/detail?id=203我已经测试了这个并且它确实按预期工作。在新的世界秩序中,您可以编写一个目录过滤器,详见此处:http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#filter
另一种解决方案是将所有文件名转换为相同的编码,例如UTF-8,并确保您的语言环境匹配。问题是如果您知道现有编码是什么并且文件一致,那么您只能转换为新编码。