回答
近似的答案是 Comparing Unicode file names the right way。
基本上,建议是大写两个字符串(使用CharUpper
,CharUpperBuff
,或LCMapString
),然后使用二进制比较比较(即memcmp或wmemcmp,不与不变区域CompareString)。文件系统不执行Unicode规范化,并且大小写规则不依赖于区域设置。
在处理字符的套管规则在不同版本的Unicode中发生变化时,会出现不幸的不明确情况,但它与您所能做的一样好。
Comparing file names in native code和Don't compare filenames是一个关于这个主题的好博客帖子。第一个是用于OrdinalIgnoreCaseCompareStrings的C/C++代码,第二个告诉你如何不一直对文件名工作,以及如何缓解这个问题。
然后是Unicode问题。虽然这些新的
OrdinalIgnoreCase
字符串比较算法适用于本地NTFS驱动器,但它们可能无法在您的FAT驱动器或网络共享上产生正确的答案。那么答案是什么?如果可能,让文件系统告诉你。
CreateFile
可以告诉你给定的文件名是否存在。只要选择正确的创作处理。如果你需要比较手柄,你可以经常使用GetFileInformationByHandle
;看看dwVolumeSerialNumber
/nFileIndexHigh
/nFileIndexLow
。
如果您使用.NET,来自微软官方的建议是使用StringComparison.OrdinalIgnoreCase
比较和ToUpperInvariant
正常化(使用Ordinal
比较以后比较)。这也适用于注册表项和值,环境变量等。
有关更多详细信息,请参见New Recommendations for Using Strings in Microsoft .NET 2.0。
请注意,虽然它在NTFS上可靠,但它可能会因网络共享而失败。请参阅@ SteveSteiner的解答中的答案和链接。
- 1. 文件比较
- 2. 文件比较
- 3. 将文件名与字符串比较
- 4. BeyondCompare部分文件名比较
- 5. 与通配符的文件名比较
- 6. 如何比较整数和文件名?
- 7. PowerShell文件名与日期比较
- 8. 击(分)文件名比较失败
- 9. Python的 - 文件名和文件夹名称比较
- 10. 比较文件名与可选文件扩展名
- 11. 比较文件.class Bejond比较4
- 12. 比较csv文件
- 13. 比较xml文件
- 14. Unix文件比较
- 15. linux文件比较
- 16. xml文件比较
- 17. perl文件比较
- 18. Jmeter文件比较
- 19. 比较.properties文件
- 20. xml文件比较
- 21. xml文件比较
- 22. Powershell文件比较
- 23. Mac C++ GUI编码 - 与Win32比较
- 24. 比较姓名
- 25. 使用系统日期作为比较文件的文件名
- 26. 的Python:文件名比较在文件夹中
- 27. 如何比较批处理文件中的文件名
- 28. 比较Linux中多个文件的文件名和md5sums
- 29. 将文件扩展名与文件头进行比较
- 30. 在不同文件夹中比较文件名字符串