2009-01-10 88 views

回答

12

您可以創建在臨時文件夾中的文件(使用小寫文件名),然後檢查文件是否存在(使用大寫的文件名),例如:

string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower(); 
File.CreateText(file).Close(); 
bool isCaseInsensitive = File.Exists(file.ToUpper()); 
File.Delete(file); 
1

嘗試創建一個全部爲小寫的臨時文件,然後使用大寫字母檢查它是否存在。

+0

約abc.xyz和aBc.xyz – masfenix 2009-01-10 00:47:30

7

.NET類庫中沒有這樣的函數。

但是,您可以推出自己的產品:嘗試使用小寫名稱創建文件,然後嘗試使用其名稱的upparcase版本打開它。可能有可能改進這種方法,但你明白了。

編輯:你實際上可能只是把第一個文件放在根目錄下,然後檢查filename.ToLower()和filename.ToUpper()是否都存在。不幸的是,很可能同一個文件的大寫和小寫變體都存在,因此您應該比較小寫和大寫變體的FileInfo.Name屬性,以確定它們是否確實相同。這不需要寫入磁盤。

顯然,如果捲上完全沒有文件,這將會失敗。在這種情況下,只需回到第一個選項(參見Martin的實現答案)。

+0

這可能失敗了怎麼辦,如果第一個現有的文件,存在於上區分大小寫的文件系統都較低和大寫字母變體。 – M4N 2009-01-10 00:38:44

+0

Martin:是的。我會相應地修改我的答案。 – 2009-01-10 00:46:21

+2

這將無法正常工作,因爲fileInfo.Name和fileInfo.FullName將保留髮送到構造函數中的情況,它將不會獲得實際文件名的大小寫! – Peter 2012-07-29 22:39:15

5

請記住,你可能有多個文件系統採用不同的套管規則。例如,根文件系統可能區分大小寫,但您可以在某處安裝不區分大小寫的文件系統(例如,帶有FAT文件系統的USB存儲器)。因此,如果您進行此類檢查,請確保您將它們放入要訪問的目錄中。

另外,如果用戶將大小寫敏感的數據複製到不區分大小寫的文件系統,該怎麼辦?如果你的文件只是大小寫不同,其中一個會覆蓋另一個,導致數據丟失。在向另一個方向複製時,也可能遇到問題,例如,如果文件A包含對文件「b」的引用,但該文件實際上被命名爲「B」。這適用於原始不區分大小寫的文件系統,但不適用於區分大小寫的系統。

因此,我建議您避免取決於文件系統是否區分大小寫或者如果可以的話。不要生成只是大小寫不同的文件名,使用標準文件選擇器對話框,準備好情況可能會發生變化等。

1

它不是.NET函數,但Windows API中的GetVolumeInformation和GetVolumeInformationByHandleW函數將你想要什麼(基於M4N的回答看YJE lpFileSystemFlags參數

0
/// <summary> 
/// Check whether the operating system is case-sensitive. 
/// For instance on Linux you can have two files/folders called 
//// "test" and "TEST", but on Windows the two can not coexist. 
/// This method does not extend to mounted filesystems, which might have different properties. 
/// </summary> 
/// <returns>true if the operating system is case-sensitive</returns> 
public static bool IsFileSystemCaseSensitive() 
{ 
    // Actually try. 
    string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower() + "test"; 
    File.CreateText(file).Close(); 
    bool result = File.Exists(file.ToUpper()); 
    File.Delete(file); 

    return result; 
} 

,有以下變化:

  • 靜態名,使我們確信它包含了一封信,不僅數字
  • 也許更具可讀性?
  • 用方法包裝。
  • 文檔。

一個更好的策略是將路徑作爲參數,並在相同的文件系統上創建文件,但是寫入文件可能會產生意想不到的後果。

0

我調用的作弊:

Path.DirectorySeparatorChar == '\\' ? "I'm insensitive" : "I'm probably sensitive" 
相關問題