一般來說判斷檔案是否存在可以藉由File類別的exists來判斷,雖說如此我們壓根兒可能沒有注意到一點,是否檔案名稱沒有區分大小寫?! 也就是說,相同的副檔名,但是檔案名稱實際是小寫,可是以大寫名稱new File,並呼叫exists是會return true的! 因此對於需要區分大小寫的情況又可以怎麼處理?
這種情況會依據OS的檔案系統而異,以Windows來說NTFS是不區分大小寫的,因此一個目錄內若有檔案test.txt,則不會允許TEST.txt建立之! 應用到Java File exists兩者就會視為同一個檔案! 若我們new File("TEST.txt")呼叫exists,想得到不存在的情況,又該如何處理?
相關程式碼如下:
依據上述的code,可以透過File API裡的getCanonicalFile()得到real file name,查看其source code,getCanonicalFile()是以getCanonicalPath()重新再new File()之,其與this已是不同的兩個實體了。
因此假設File f = new File("TEST.txt"),此時f.getCanonicalFile().getName()會得到的將是實際的檔案名稱test.txt,而不是TEST.txt (f.getName()才是)
DEMO如下:
這種情況會依據OS的檔案系統而異,以Windows來說NTFS是不區分大小寫的,因此一個目錄內若有檔案test.txt,則不會允許TEST.txt建立之! 應用到Java File exists兩者就會視為同一個檔案! 若我們new File("TEST.txt")呼叫exists,想得到不存在的情況,又該如何處理?
相關程式碼如下:
System.out.println("目前目錄內所有檔案如下:");
File current = new File(".");
for(File subFile : current.listFiles()) {
if(subFile.isFile()) {
System.out.println(subFile.getName());
}
}
System.out.println("-------------------------");
Scanner input = new Scanner(System.in);
try {
System.out.println("判斷檔案是否存在(輸入檔名)?");
String name = input.nextLine();
File f = new File(name);
System.out.println("#Method 1: Call exists()");
if(f.exists()) {
System.out.println("File "+name+" exists");
}else {
System.out.println("File "+name+" non-exists");
}
System.out.println("#Method 2: Call exists() && getCanonicalFile name is not equal 'input name'");
try {
if(f.exists() && f.getCanonicalFile().getName().equals(name)) {
System.out.println("File "+name+" exists");
}else {
System.out.println("File "+name+" non-exists");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}finally {
input.close();
}
依據上述的code,可以透過File API裡的getCanonicalFile()得到real file name,查看其source code,getCanonicalFile()是以getCanonicalPath()重新再new File()之,其與this已是不同的兩個實體了。
因此假設File f = new File("TEST.txt"),此時f.getCanonicalFile().getName()會得到的將是實際的檔案名稱test.txt,而不是TEST.txt (f.getName()才是)
DEMO如下:
留言
張貼留言