Java - 判斷檔案是否存在issues

一般來說判斷檔案是否存在可以藉由File類別的exists來判斷,雖說如此我們壓根兒可能沒有注意到一點,是否檔案名稱沒有區分大小寫?! 也就是說,相同的副檔名,但是檔案名稱實際是小寫,可是以大寫名稱new File,並呼叫exists是會return true的! 因此對於需要區分大小寫的情況又可以怎麼處理?

這種情況會依據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如下:

留言