1

我需要检查文件是否存在。这可以通过File#exists()方法来完成。但是这种存在性检查是区分大小写的。我的意思是,如果我在代码中有一个文件名 some_image_file.jpg 但如果文件在物理上是 some_image_file.JPG 那么这个方法说该文件不存在。如何检查对扩展名不区分大小写的文件是否存在并获取实际文件名?

在我的场景中,我有一个 excel 文件。每行包含文件的元数据和文件名。在某些情况下我只有文件名或其他情况下我可以有完整路径。我将一行表示为文档。

这些文件被放置在服务器中。我的工作是

  • 逐行读取excel文件并列出所有文档。
  • 取出文件名或文件路径。
  • 创建文件的完整路径。
  • 检查文件是否存在。
  • 验证文档中提供的其他元数据/信息。
  • 上传文件。

如果文件不存在或某些元数据无效,我的应用程序会引发异常。

excel文件是客户写的,他们写错了一些文件名,我的意思是如果文件物理上有小写的扩展名,他们把扩展名写成大写,反之亦然。

我在 unix 服务器上运行应用程序。

由于文件扩展名不匹配,所以File#exists()给出错误,最终我的代码抛出异常。

放置文件的文件夹可以有 30000 个或更多文件。

我想要的是

  • 获取文件的完整路径。
  • 检查文件是否存在。
  • 如果它不存在,那么
  • 通过转换扩展名的大小写来检查文件是否存在。
  • 如果在大小写转换后不存在,则抛出异常。
  • 如果存在,则返回实际的文件名或文件路径。

如果文件名具有类似.JPG的文件扩展名,不知道该怎么办!我应该通过改变大小写来检查它吗?

4

3 回答 3

2

您可以使用以下方式获取文件夹中的文件名

File.list() 

并通过以下方式检查名称

equalsIgnoreCase()

或尝试http://commons.apache.org/io/ 并使用

FileNameUtils.directoryContains(final String canonicalParent, final String canonicalChild)
于 2012-11-29T07:12:14.337 回答
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是文件的完整路径。

于 2013-03-04T10:08:12.760 回答
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;
    }
}
于 2017-11-23T17:03:44.907 回答