如何确定文件系统是否在.net中区分大小写?

问题描述:

.net是否有办法确定本地文件系统是否区分大小写?如何确定文件系统是否在.net中区分大小写?

您可以创建在临时文件夹中的文件(使用小写文件名),然后检查文件是否存在(使用大写的文件名),例如:

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

尝试创建一个全部为小写的临时文件,然后使用大写字母检查它是否存在。

+0

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

.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

请记住,你可能有多个文件系统采用不同的套管规则。例如,根文件系统可能区分大小写,但您可以在某处安装不区分大小写的文件系统(例如,带有FAT文件系统的USB存储器)。因此,如果您进行此类检查,请确保您将它们放入要访问的目录中。

另外,如果用户将大小写敏感的数据复制到不区分大小写的文件系统,该怎么办?如果你的文件只是大小写不同,其中一个会覆盖另一个,导致数据丢失。在向另一个方向复制时,也可能遇到问题,例如,如果文件A包含对文件“b”的引用,但该文件实际上被命名为“B”。这适用于原始不区分大小写的文件系统,但不适用于区分大小写的系统。

因此,我建议您避免取决于文件系统是否区分大小写或者如果可以的话。不要生成只是大小写不同的文件名,使用标准文件选择器对话框,准备好情况可能会发生变化等。

它不是.NET函数,但Windows API中的GetVolumeInformation和GetVolumeInformationByHandleW函数将你想要什么(基于M4N的回答看YJE lpFileSystemFlags参数

/// <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; 
} 

,有以下变化:

  • 静态名,使我们确信它包含了一封信,不仅数字
  • 也许更具可读性?
  • 用方法包装。
  • 文档。

一个更好的策略是将路径作为参数,并在相同的文件系统上创建文件,但是写入文件可能会产生意想不到的后果。

我调用的作弊:

Path.DirectorySeparatorChar == '\\' ? "I'm insensitive" : "I'm probably sensitive"