出于某种原因,当我使用 Win32 APISHFormatDateTime
函数获取文件的修改日期时,无论带有什么标志,它都会在前面添加一些奇怪的特殊字符,如下所示。
这发生在循环文件()的上下文中WIN32_FIND_DATAA findData
,这可能与此相关,也可能不相关。
简单的 ANSI 版本 - SHFormatDateTimeA
:
hFind = FindFirstFileA(full_path.c_str(), &findData);
while (FindNextFileA(hFind, &findData) != 0) {
char datebuf[80];
DWORD flags = FDTF_DEFAULT;
SHFormatDateTimeA(&findData.ftLastWriteTime, &flags, datebuf, 80);
std::string lastModifiedDateStr = std::string(datebuf);
输出:?4/?25/?2025 ??9:44 AM
Unicode 版本 - SHFormatDateTimeW
:
wchar_t datebuf[80];
DWORD flags = FDTF_DEFAULT;
SHFormatDateTimeW(&findData.ftLastWriteTime, &flags, datebuf, 80);
std::wstring lastModifiedDateStr = std::wstring(datebuf);
输出:u+200E 4 / u+200E 25 / u+200E 2025 u+200F u+200E 9 : 44 AM
因此,无论使用 ANSI 还是 Unicode,该函数SHFormatDateTime
都会在每个部分前添加一些奇怪的字符。我尝试了各种标志,例如FDTF_DEFAULT
、FDTF_SHORTDATE
,甚至NULL
。其他 Shell WIn32 API 函数没有这个问题。
U+200E 是
LEFT-TO-RIGHT MARK
。这确保格式化的文本在从右到左的语言环境中处理时按从左到右的顺序显示。如果插入这些标记,您的flags
变量将相应地更新以包含FDTF_RTLDATE
或FDTF_LTRDATE
标志(这就是pdwflags
参数为 的原因[in, out]
):例如:
您可以通过
FDTF_NOAUTOREADINGORDER
在输入上指定标志来抑制此行为: