Windows和区分大小写的文件系统

曾几何时,Windows诞生之初就使用FAT文件系统。 然后由Microsoft取代,IBM开发了NTFS。 在过去,出现了两种相反的文件系统方法。 Linux使用区分大小写的文件系统,而Microsoft使用区分大小写的文件系统。

最重要的是,在区分大小写的文件系统中,认为写入不同寄存器的名称(例如FILE.txt和file.txt)是不同的名称。 但是对于Windows,它们之间没有区别。



尽管Windows不区分大小写,但NTFS开发人员已负责任地处理了此问题,并仔细保留了目录和文件名的寄存器。 也许他们并没有失去与交战营和解的希望。

首批受害者


多年过去了,信息技术并没有停滞不前,Linux发行版学会了挂载NTFS分区。 操作系统之间的距离越来越近,我们的对手第一次在同一领域发生冲突-并且出现了第一个问题。 通过附加NTFS分区,Linux用户可以在同一目录中创建几个不同的文件,其名称仅大小写不同。 众所周知,NTFS在创建文件系统对象时会保留字母的大小写。 如果以后将相同的NTFS分区连接到Windows,则操作系统将开始使孪生文件相互混淆。 从她的角度来看,他们有相同的名字! 用户单击一个文件,然后打开一个完全不同的文件。 简而言之,混乱和耻辱。

2016年,Microsoft向Linux迈进了一步,并发布了带有WSL子系统的Windows 10周年更新。 Windows Linux子系统(WSL)提供的界面与Linux内核界面基本兼容。 这使您可以运行大多数Linux应用程序,包括某些Linux发行版的原始映像。 例如,Ubuntu 14.04! 这是一场革命! Linux和Windows与合作伙伴同时在同一台计算机上工作。 但不幸的是,合作伙伴在使用文件系统方面对大小写敏感性的看法仍然不同。 通过仅使用区分大小写的名称创建文件或目录来混淆Windows变得更加容易。

尝试和解


在新版本的Windows 10 Spring Creators Update中,Microsoft增加了为单个目录设置区分大小写模式的功能。 可以使用fsutil实用程序来完成。 读者可能已经熟悉此有用的实用程序。

现在,她有两个新团队:

fsutil文件queryCaseSensitiveInfo


fsutil文件setCaseSensitiveInfo



为了使用这些命令,您必须已激活WSL子系统,并且setCaseSensitiveInfo命令需要管理员权限。

打开区分大小写模式后,仅在指定文件和目录的确切名称后,位于其中的文件和目录才可用! Windows现在可以清楚地看到FILE.txt和file.txt之间的区别。

另一方面,WSL子系统还必须考虑是否在其创建文件或子目录的目录中启用了区分大小写模式。 构成WSL结构或从WSL创建的目录立即启用了区分大小写功能。 默认情况下,所有其他目录都不启用区分大小写模式。

如果转到WSL时关闭了区分大小写的目录,并尝试在其中创建两个文件(名称仅因大小写而异),则会出现错误。

因此,WSL和Windows在它们之间划分了逻辑驱动器。 一些目录支持区分大小写模式,而其他目录则不支持。

往下走


在后台,带有新FileCaseSensitiveInformation参数的NtQueryInformationFile和NtSetInformationFile函数用于获取和设置区分大小写标志。

一个例子:

HANDLE h = CreateFile( path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_SUPPORTS_USN_JOURNAL, 0); if( INVALID_HANDLE_VALUE == h ) return; IO_STATUS_BLOCK io; uint32_t csFlags = 0; DWORD error = NtQueryInformationFile( testHandle, &io, &csFlags, sizeof(csFlags), (FILE_INFORMATION_CLASS)0x47); // FileCaseSensitiveInformation CloseHandle(h); 

作为该函数操作的结果,如果启用了区分大小写模式,则csFlags变量将为1,如果禁用则将其设置为0。

更低-原始NTFS


在NTFS级别,区分大小写标志存储在StandartInfoData属性的NumVersion字段中。
如果设置了属性,则NumVersion = 1,否则NumVersion = 0

 typedef struct _StandartInfoData_ { FILETIME CreateTime; FILETIME LastModTime; FILETIME LastModMFT; FILETIME LastAccess; DWORD FileAttrib; DWORD MaxVersions; DWORD NumVersion; // <-- DWORD ClassId; DWORD OwnerId; DWORD SecureId; ULONGLONG Quota; ULONGLONG SequenceNumber; } StandartInfoData; 

结论


我们看到,微软正在做出巨大的努力来将两个不同的世界结合在一个系统中-Windows和Linux。 为了成功完成任务,他们在文件系统区分大小写方面做出了让步。 有帮助吗? 矛盾会解决吗? 还有什么其他问题呢? 所有这些将仅在His下时期显示。

通缉


对了 还是不太正确。 在这里,我们的同事正在寻找自动测试开发小组的负责人。 在新西伯利亚真正的工作。 如果有人感兴趣,那么这就是空缺

Source: https://habr.com/ru/post/zh-CN414239/


All Articles