Così si desidera ottenere i nomi sensibili casi reali di file memorizzati nel file system. Consente di imaging abbiamo i seguenti percorsi:
- su Linux: utilizzando ext4 (che è case sensitive)
/testFolder/test.PnG
- su di Windows utilizzando NTFS (che non è caso sensibile)
c:\testFolder\test.PnG
No w consente di creare alcuni oggetti Java File
in ciascun file immagine.
// 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
Il tuo problema è che tutte le chiamate di File
come File.exists
vengono reindirizzati alla classe java.io.FileSystem
che rappresenta le chiamate vero sistema operativo del vostro file system da parte del JVM
. Quindi non è possibile distinguere su macchine Windows tra test.PNG
e test.png
. Neanche Windows stesso.
Ma anche su Windows ogni File ha un nome definito nel File System che potrebbe essere ad esempio: test.PnG
. Lo vedrai nel tuo Windows Explorer
o nella riga di comando se scrivi dir c:\testFolder
.
Quindi, ciò che è possibile fare in Java è utilizzare il metodo File.list
su parent directory
che risulta nella chiamata dell'elenco Sistema operativo per tutti i file in questa directory con i loro nomi reali.
File dir = new File("c://testFolder//");
for(String fileName : dir.list())
System.out.println(fileName);
// OUTPUT: test.PnG
o se si preferisce File
oggetti
File dir = new File("c://testFolder//");
for(File file : dir.listFiles())
System.out.println(file.getName());
// OUTPUT: test.PnG
È possibile utilizzare questo per scrivere il proprio exists
metodo che è case sensitive su tutti i sistemi operativi
public boolean exists(File dir, String filename){
String[] files = dir.list();
for(String file : files)
if(file.equals(filename))
return true;
return false;
}
usare in questo modo:
File dir = new File("c:\\testFolder\\");
exists(dir, "test.png"); // false
exists(dir, "test.PNG"); // false
exists(dir, "test.PnG"); // true
EDIT: Devo ammettere che ho sbagliato. C'è un modo per ottenere il vero nome di un file. Ho sempre trascurato il metodo File.getCanonicalPath
.
Ancora il nostro esempio: abbiamo quel file c:\testFolder\test.PnG
.
File f = new File("c://testFolder//test.png");
System.out.println(f.getCanonicalPath());
// OUTPUT: C:\testFolder\test.PnG
Con questa conoscenza è possibile scrivere un metodo di prova semplice per l'estensione sensibili caso senza l'iterazione di tutti i file.
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;
}
Utilizzare in questo modo:
File f = new File("c://testFolder//test.png");
checkExtensionCaseSensitive(f, "png"); // false
checkExtensionCaseSensitive(f, "PNG"); // false
checkExtensionCaseSensitive(f, "PnG"); // true
No, quella domanda chiede come caricare Abc.txt da abc.txt. Chiedo come rilevare se esiste abc.txt o abc.TXT. –
Ogni dipendente ha un'immagine, ma memorizza in diverse estensioni jpg JPG png o PNG. ma la mia funzione restituisce sempre jpg o png mentre l'estensione esistente è JPG o PNG –
@John Hascal restituisce sempre l'estensione minuscola –