因此,您希望获得存储在文件系统中的文件的真实区分大小写的名称.让我们有成像,我们有以下路径:
在Linux上:使用ext4(区分大小写)/testFolder/test.PnG
在Windows上使用NTFS(不区分大小写)c:\testFolder\test.PnG
现在让我们File
为每个图像文件创建一些Java 对象.
// 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
.Windows Explorer
如果键入,您将在您的或命令行中看到此信息dir c:\testFolder
.
因此,您可以在Java 中执行的操作是使用该File.list
方法parent directory
导致操作系统列表调用此目录中的所有文件及其真实名称.
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
如果您正在寻找一个可以在任何平台上确定文件存在且区分大小写的函数;这应该做到这一点:
public static boolean fileExistsCaseSensitive(String path) { try { File file = new File(path); return file.exists() && file.getCanonicalFile().getName().equals(file.getName()); } catch (IOException e) { return false; } }