我需要检查文件是否存在。这可以通过File#exists()
方法完成。但是这种存在检查是区分大小写的。我的意思是如果我在代码中有一个文件名some_image_file.jpg但是如果物理上该文件是some_image_file.JPG,那么这个方法说该文件不存在。如何检查文件是否存在,对扩展名不敏感并获取实际文件名?
在我的场景中,我有一个excel文件。每行包含文件和文件名的元数据。在某些情况下,我只有文件名或其他情况,我可以有完整的路径。我将一行表示为文档。
这些文件放在服务器中。我的工作是
如果文件不存在或某些元数据无效,我的应用程序会抛出异常。
excel文件是由客户编写的,他们写错了一些文件名,我的意思是如果文件在物理上有小写的扩展名,他们用大写写的扩展名,反之亦然。
我在unix服务器上运行应用程序。
由于文件扩展名不匹配,因此File#exists()
给出错误,最终我的代码抛出异常。
放置文件的文件夹可以包含30000个或更多文件。
我想要的是
如果文件名的文件扩展名类似于 .Jpg ,则不知道该怎么做!我应该通过改变案例进行检查来检查吗?
答案 0 :(得分:2)
您可以使用
获取文件夹中的文件名File.list()
并通过
检查名称equalsIgnoreCase()
或试试http://commons.apache.org/io/ 并使用
FileNameUtils.directoryContains(final String canonicalParent, final String canonicalChild)
答案 1 :(得分:0)
这样我解决了这个问题:
public String getActualFilePath() {
File givenFile = new File(filePath);
File directory = givenFile.getParentFile();
if(directory == null || !directory.isDirectory()) {
return filePath;
}
File[] files = directory.listFiles();
Map<String, String> fileMap = new HashMap<String, String>();
for(File file : files) {
if(file.isDirectory()){
continue;
}
String absolutePath = file.getAbsolutePath();
fileMap.put(absolutePath, StringUtils.upperCase(absolutePath));
}
int noOfOcc = 0;
String actualFilePath = "";
for(Entry<String, String> entry : fileMap.entrySet()) {
if(filePath.toUpperCase().equals(entry.getValue())) {
actualFilePath = entry.getKey();
noOfOcc++;
}
}
if(noOfOcc == 1) {
return actualFilePath;
}
return filePath;
}
此处filePath
是文件的完整路径。
答案 2 :(得分:0)
规范名称返回区分大小写的名称。如果它返回的字符串不同于您要查找的文件的名称,则该文件存在不同的大小写。
因此,测试文件是否存在或其规范名称是否不同
public static boolean fileExistsCaseInsensitive(String path) {
try {
File file = new File(path);
return file.exists() || !file.getCanonicalFile().getName().equals(file.getName());
} catch (IOException e) {
return false;
}
}