因此,您希望获取存储在文件系统中的文件的真实大小写敏感名称。让成像我们有以下路径:
- 在 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
您的问题是File 的所有调用(如File.exists)都被重定向到java.io.FileSystem 类,该类表示由JVM 对文件系统的实际操作系统调用。因此,您无法在 Windows 机器上区分 test.PNG 和 test.png。 Windows 本身也没有。
但是即使在 Windows 上,每个文件在文件系统中都有一个已定义的名称,例如:test.PnG。如果您键入 dir c:\testFolder,您将在 Windows Explorer 或命令行中看到此内容。
因此,您可以在 Java 中做的是使用 parent directory 上的 File.list 方法,这会导致操作系统列表调用此目录中的所有文件及其真实名称。
File dir = new File("c://testFolder//");
for(String fileName : dir.list())
System.out.println(fileName);
// OUTPUT: test.PnG
或者如果您更喜欢File 对象
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