Sie möchten also die echten Namen von Dateien, die in Ihrem Dateisystem gespeichert sind. Lets Bildgebung haben wir folgende Wege:
- auf Linux: mit ext4
/testFolder/test.PnG
- auf Windows- mit NTFS (die nicht Fall ist (die Groß- und Kleinschreibung) empfindlich)
c:\testFolder\test.PnG
Nr w können einige Java File
Objekte zu jeder Bilddatei erstellen.
// 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
Ihr Problem ist, dass alle Anrufe von File
wie File.exists
auf die java.io.FileSystem
Klasse umgeleitet werden, die von der JVM
realen Betriebssystemaufrufe des Dateisystems darstellt. Sie können also unter Windows nicht zwischen test.PNG
und test.png
unterscheiden. Auch Windows selbst nicht.
Aber sogar unter Windows jede Datei hat einen definierten Namen im Dateisystem, der zum Beispiel sein könnte: test.PnG
. Sie sehen dies in Ihrer Windows Explorer
oder in der Befehlszeile, wenn Sie dir c:\testFolder
eingeben.
Also, was Sie in Java tun können, ist die File.list
Methode auf der parent directory
, die in der Betriebssystemliste Anruf für alle Dateien in diesem Verzeichnis mit ihren echten Namen führt.
File dir = new File("c://testFolder//");
for(String fileName : dir.list())
System.out.println(fileName);
// OUTPUT: test.PnG
oder wenn Sie es vorziehen File
Objekte
File dir = new File("c://testFolder//");
for(File file : dir.listFiles())
System.out.println(file.getName());
// OUTPUT: test.PnG
Hiermit können Sie Ihre eigene exists
Methode schreiben, die Groß- und Kleinschreibung auf allen Betriebssystemen ist
public boolean exists(File dir, String filename){
String[] files = dir.list();
for(String file : files)
if(file.equals(filename))
return true;
return false;
}
es wie folgt verwendet:
File dir = new File("c:\\testFolder\\");
exists(dir, "test.png"); // false
exists(dir, "test.PNG"); // false
exists(dir, "test.PnG"); // true
EDIT: Ich muss zugeben, dass ich falsch lag. Es gibt eine Möglichkeit, den richtigen Namen einer Datei zu erhalten. Ich habe immer die Methode File.getCanonicalPath
übersehen.
Wieder unser Beispiel: Wir haben diese Datei c:\testFolder\test.PnG
.
File f = new File("c://testFolder//test.png");
System.out.println(f.getCanonicalPath());
// OUTPUT: C:\testFolder\test.PnG
Mit diesem Wissen können Sie ohne Iterieren alle Dateien ein einfaches Testverfahren für die Groß- und Kleinschreibung Erweiterung schreiben.
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;
}
es wie folgt verwendet:
File f = new File("c://testFolder//test.png");
checkExtensionCaseSensitive(f, "png"); // false
checkExtensionCaseSensitive(f, "PNG"); // false
checkExtensionCaseSensitive(f, "PnG"); // true
Nein, diese Frage fragt, wie Abc.txt von abc.txt geladen wird. Ich frage nach, wie man erkennt, ob abc.txt oder abc.TXT existiert. –
Jeder Mitarbeiter hat ein Bild, aber sie speichern in verschiedenen Erweiterungen jpg JPG PNG oder PNG. aber meine Funktion gibt immer jpg oder png zurück, während die Extension ist JPG oder PNG –
@John Hascal immer noch Kleinbuchstaben Extension –