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

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

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

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

.NET类库中没有这样的函数。

但是,您可以自行推出:尝试使用小写名称创建文件,然后尝试使用其名称的upparcase版本打开它。 也许有可能改进这种方法,但你明白了。

编辑 :你实际上可能只是采取根目录中的第一个文件,然后检查filename.ToLower()和filename.ToUpper()是否存在。 不幸的是,相同文件的大写和小写变体都可能存在,因此您应该比较小写字母和大写变体的FileInfo.Name属性,以确定它们是否确实相同。 这不需要写入磁盘。

很明显,如果卷上没有任何文件,这将会失败。 在这种情况下,回到第一个选项(参见Martin的实现答案)。

请记住,您可能有多个具有不同外壳规则的文件系统。 例如,根文件系统可能区分大小写,但您可以在某处安装不区分大小写的文件系统(例如,带有FAT文件系统的USB盘)。 所以如果你做这样的检查,确保你把它们放在你要访问的目录中。

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

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

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

这不是一个.NET函数,但Windows API中的GetVolumeInformation和GetVolumeInformationByHandleW函数将执行您所需的操作(请参阅参数yFileSystemFlags。

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

基于M4N的回答,有以下变化:

  • 静态名称,以便我们确信它包含一个字母,而不仅仅是数字。
  • 也许更可读?
  • 用一种方法包装。
  • 文档。

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