如何确定文件系统是否在.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函数将你想要什么(基于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"
约abc.xyz和aBc.xyz – masfenix 2009-01-10 00:47:30