2012-11-29 105 views
1

我需要檢查文件是否存在。這可以通過File#exists()方法來完成。但是這種存在檢查是區分大小寫的。我的意思是如果我在代碼中有一個文件名some_image_file.jpg,但是如果物理文件是some_image_file.JPG,那麼這個方法說這個文件不存在。如何檢查文件是否存在對擴展名不區分大小寫並獲取實際文件名?區分大小寫的文件擴展名和存在檢查

在我的場景中,我有一個excel文件。每行包含文件和文件名的元數據。在某些情況下,我只有文件名或其他情況下可以有完整路徑。我正在表明一行文件。

這些文件被放置在服務器中。我的工作是

  • 逐行讀取excel文件並列出所有文件。
  • 取出文件名或文件路徑。
  • 創建文件的完整路徑。
  • 檢查文件是否存在。
  • 驗證文檔中提供的其他元數據/信息。
  • 上傳文件。

如果文件不存在或某些元數據無效,我的應用程序會拋出異常。

excel文件是由客戶編寫的,他們寫了一些錯誤的文件名,我的意思是如果文件物理上有小寫的擴展名,他們用大寫寫了擴展名,反之亦然。

我在UNIX服務器上運行應用程序。

由於文件擴展名不匹配,所以File#exists()給出了錯誤,最終我的代碼拋出異常。

放置文件的文件夾可以包含30000或更多文件。

我要的是

  • 要採取文件的完整路徑。
  • 檢查文件是否存在。
  • 如果不存在,則
  • 通過轉換擴展的大小寫來檢查文件是否存在。
  • 如果大小寫轉換後不存在,則拋出異常。
  • 如果存在,則返回實際的文件名或文件路徑。

如果文件名具有文件擴展名類似.JPG,不知道該怎麼辦!我應該通過改變案例來排查它嗎?

+0

只是爲了檢查 - 你在Windows上運行,對不對? (在一個區分大小寫的文件系統上,這個問題沒有多大意義。)我剛剛嘗試過使用'File.exists',故意指定錯誤的文件名大小寫,並且它工作正常... –

+0

@JonSkeet我在UNIX中運行。 –

+0

好的,這對於'File.exists'的行爲來說更有意義 - 但是對於你爲什麼要這麼做的意義不大。你從哪裏得到文件名?你可以依靠哪些信息? –

回答

0

這樣我已解決問題:

public String getActualFilePath() { 
    File givenFile = new File(filePath); 
    File directory = givenFile.getParentFile(); 

    if(directory == null || !directory.isDirectory()) { 
     return filePath; 
    } 


    File[] files = directory.listFiles(); 
    Map<String, String> fileMap = new HashMap<String, String>(); 

    for(File file : files) {       
     if(file.isDirectory()){ 
      continue; 
     } 

     String absolutePath = file.getAbsolutePath(); 
     fileMap.put(absolutePath, StringUtils.upperCase(absolutePath)); 
    } 

    int noOfOcc = 0; 
    String actualFilePath = ""; 

    for(Entry<String, String> entry : fileMap.entrySet()) { 
     if(filePath.toUpperCase().equals(entry.getValue())) { 
      actualFilePath = entry.getKey(); 
      noOfOcc++; 
     } 
    } 

    if(noOfOcc == 1) { 
     return actualFilePath; 
    } 

    return filePath; 
} 

這裏filePath是文件的完整路徑。

2

您可以用

File.list() 

得到一個文件夾中的文件名和由

equalsIgnoreCase() 

手段檢查名稱或嘗試http://commons.apache.org/io/ 和使用

FileNameUtils.directoryContains(final String canonicalParent, final String canonicalChild) 
+0

謝謝。但我沒有該文件夾的名稱,該文件可能不存在。 –

+0

你的意思是說,你正在檢查完整的文件名,類型是「D:\ test \ base \ some_image_file.JPEG」? – Romczyk

+0

就是這樣的。但在這種情況下,可以通過少量字符串操作來提取文件夾名稱。但該文件夾可以有30000或更多的文件。所以在這種情況下,我需要列出所有這些文件的每個文件! –

0

規範名稱返回名稱並區分大小寫。如果它返回的字符串不是您要查找的文件的名稱,則該文件存在不同的大小寫。

因此,測試文件是否存在,或者如果它的規範名稱是不同

public static boolean fileExistsCaseInsensitive(String path) { 
    try { 
     File file = new File(path); 
     return file.exists() || !file.getCanonicalFile().getName().equals(file.getName()); 
    } catch (IOException e) { 
     return false; 
    } 
} 
相關問題