gpt4 book ai didi

Java 文件存在区分大小写的 .jpg 和 .JPG

转载 作者:IT老高 更新时间:2023-10-28 20:52:35 25 4
gpt4 key购买 nike

我使用这个函数来检测我的文件是否存在。虽然我有一些图像存储为 .jpg、.JPG、.png 和 .PNG。但即使真实文件的扩展名为 .JPG 或 .PNG,它也总是将 .jpg 或 .png 返回为真。

在我将它呈现到我的网页后,它会引发错误“加载资源失败:服务器响应状态为 404(未找到)”。

public static String getPhotoFileExtension(int empKey){
try{
String[] types = {".jpg",".JPG",".png", ".PNG"};
for(String t : types)
{
String path = "/"+Common.PHOTO_PATH + empKey + t;
File f = new File(Sessions.getCurrent().getWebApp()
.getRealPath(path));
if(f.isFile())
return t;
}
}catch (Exception e) {
e.printStackTrace();
}
return "";
}

最佳答案

因此,您想要获取存储在文件系统中的文件的真实大小写敏感名称。让我们成像我们有以下路径:

  • Linux: 使用 ext4(区分大小写)/testFolder/test.PnG
  • Windows 上使用 NTFS(区分大小写)c:\testFolder\test.PnG

现在让我们为每个图像文件创建一些 Java File 对象。

// on Linux
File f1 = new File("/testFolder/test.png");
File f2 = new File("/testFolder/test.PNG");
File f3 = new File("/testFolder/test.PnG");
f1.exists(); // false
f2.exists(); // false
f3.exists(); // true

// on Windows
File f1 = new File("c:\\testFolder\\test.png");
File f2 = new File("c:\\testFolder\\test.PNG");
File f3 = new File("c:\\testFolder\\test.PnG");
f1.exists(); // true
f2.exists(); // true
f3.exists(); // true

你的问题是 FileFile.exists 的所有调用都被重定向到代表真正操作的 java.io.FileSystemJVM 对文件系统的系统调用。因此,您无法在 Windows 机器上区分 test.PNGtest.png。 Windows 本身也没有。

但是即使在 Windows 上,每个文件在文件系统中都有一个已定义的名称,例如:test.PnG。如果您键入 dir c:\testFolder,您将在 Windows Explorer 或命令行中看到此内容。

因此,您可以在 Java 中做的是使用 父目录 上的 File.list 方法,这会导致操作系统列表调用此目录中的所有文件及其真实名称.

File dir = new File("c://testFolder//");
for(String fileName : dir.list())
System.out.println(fileName);
// OUTPUT: test.PnG

或者如果你更喜欢文件对象

File dir = new File("c://testFolder//");
for(File file : dir.listFiles())
System.out.println(file.getName());
// OUTPUT: test.PnG

您可以使用它来编写自己的 exists 在所有操作系统上都区分大小写的方法

public boolean exists(File dir, String filename){
String[] files = dir.list();
for(String file : files)
if(file.equals(filename))
return true;
return false;
}

像这样使用它:

File dir = new File("c:\\testFolder\\");
exists(dir, "test.png"); // false
exists(dir, "test.PNG"); // false
exists(dir, "test.PnG"); // true



编辑:我不得不承认我错了。有一种方法可以获取文件的真实名称。我总是忽略了 File.getCanonicalPath 方法。
还是我们的例子:我们有那个文件 c:\testFolder\test.PnG.

File f = new File("c://testFolder//test.png");
System.out.println(f.getCanonicalPath());
// OUTPUT: C:\testFolder\test.PnG

有了这些知识,您可以为区分大小写的扩展编写一个简单的测试方法,而无需迭代所有文件。

public boolean checkExtensionCaseSensitive(File _file, String _extension) throws IOException{
String canonicalPath = _file.getCanonicalPath();
String extension = "";
int i = canonicalPath.lastIndexOf('.');
if (i > 0) {
extension = canonicalPath.substring(i+1);
if(extension.equals(_extension))
return true;
}
return false;
}

像这样使用它:

File f = new File("c://testFolder//test.png");    
checkExtensionCaseSensitive(f, "png"); // false
checkExtensionCaseSensitive(f, "PNG"); // false
checkExtensionCaseSensitive(f, "PnG"); // true

关于Java 文件存在区分大小写的 .jpg 和 .JPG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com