区分大小写的文件扩展名和存在检查
我需要检查文件是否存在。 这可以通过File#exists()
方法完成。 但是这种存在检查是区分大小写的。 我的意思是如果我在代码中有一个文件名some_image_file.jpg但是如果物理上该文件是some_image_file.JPG,则此方法表示该文件不存在。 如何检查文件是否存在,对扩展名不敏感并获取实际文件名?
在我的场景中,我有一个excel文件。 每行包含文件和文件名的元数据。 在某些情况下,我只有文件名或其他情况,我可以有完整的路径。 我将一行表示为文档。
这些文件放在服务器中。 我的工作是
- 逐行读取excel文件并列出所有文档。
- 取出文件名或文件路径。
- 创建文件的完整路径。
- 检查文件是否存在。
- validation文档中提供的其他元数据/信息。
- 上传文件。
如果文件不存在或某些元数据无效,我的应用程序将抛出异常。
excel文件是由客户编写的,他们写错了一些文件名,我的意思是如果文件在物理上有小写的扩展名,他们用大写写的扩展名,反之亦然。
我在unix服务器上运行应用程序。
由于文件扩展名不匹配,因此File#exists()
给出了false,最终我的代码抛出了exception。
放置文件的文件夹可以包含30000个或更多文件。
我想要的是
- 获取文件的完整路径。
- 检查文件是否存在。
- 如果它不存在那么
- 通过转换扩展的大小写来检查文件是否存在。
- 如果在大小写转换后它不存在则抛出exception。
- 如果存在,则返回实际的文件名或文件路径。
如果文件名的文件扩展名类似于.Jpg ,则不知道该怎么做! 我应该通过更换shell来检查它吗?
您可以在文件夹中获取文件名
File.list()
并通过以下方式检查名称
equalsIgnoreCase()
或者尝试http://commons.apache.org/io/并使用
FileNameUtils.directoryContains(final String canonicalParent, final String canonicalChild)
这样我就解决了这个问题:
public String getActualFilePath() { File givenFile = new File(filePath); File directory = givenFile.getParentFile(); if(directory == null || !directory.isDirectory()) { return filePath; } File[] files = directory.listFiles(); Map fileMap = new HashMap(); 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 entry : fileMap.entrySet()) { if(filePath.toUpperCase().equals(entry.getValue())) { actualFilePath = entry.getKey(); noOfOcc++; } } if(noOfOcc == 1) { return actualFilePath; } return filePath; }
这里filePath
是文件的完整路径。
规范名称返回区分大小写的名称。 如果它返回的字符串不是您要查找的文件的名称,则该文件存在不同的大小写。
因此,请测试文件是否存在或者其规范名称是否不同
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; } }