【发布时间】:2019-10-12 18:19:24
【问题描述】:
我已经查看了询问目录/文件名在 Windows 环境中是否区分大小写的问题/答案,以及讨论需要区分大小写搜索的问题/答案 [通常在 Python 中,而不是 C 中],所以我想我了解基本事实,但没有一篇帖子包含我的特定应用程序架构,以及我解决问题时遇到的问题。 所以,让我简要解释一下我所说的应用程序架构。该应用程序的核心是使用 Adobe AIR 构建的。是的,这意味着大部分 U/I 都涉及 Flex 框架,但我需要帮助的文件处理问题不依赖于应用程序的 Flex U/I 部分。 当我试图处理一个非常大的递归目录结构列表时,我通过一种行为良好的机制使用低级 C 运行时 API,AIR 为需要访问主机的本机环境的情况提供了这种机制。
我使用的函数套件是 FindFileFirst、FindFileNext 和 FindClose。如果我编写一个独立的测试程序,它会很好地列出目录、子目录和文件。目录和文件的大小写正确显示——就像它们在 Windows 资源管理器中正确显示一样,或者使用 dir 命令。
但是,如果我通过 Adobe ANE 界面启动完全相同的功能,我会收到完全相同的输出,但所有目录名称都将缩减为小写。
现在,我要澄清的是,当这段代码作为原生扩展执行时,它不会将数据传回 AIR,而是直接将结果输出到一个完全在 CRT 世界中打开和关闭的文件中,所以我们不是在谈论通过在两个不同世界之间传递文本或字节数组而造成的任何形式的通信混乱。
没有用大量无关代码将这个论坛塞满,我认为可以帮助任何能够帮助我的人是这些 sn-ps:
// This is where the output gets written.
FILE* textFile = _wfopen (L"Peek.txt", L"wt,ccs=UTF8");
WIN32_FIND_DATAW fdf;
HANDLE find = NULL;
wchar_t fullPath[2048];
// I am just showing the third argument as a literal to exemplify
// what, in reality is passed into the recursively-called function as
// a variable.
wsprintf (fullPath, L"\\\\?\\%ls\\*.*", L"F:\\");
hFind = FindFirstFile (fullPath, &fdf);
// After checking for success there appears a do..while loop
// inside which there is the expected check for the "." and ".."
// pseudo directories and a test of fdf.dwFileAttributes for
// file versus sub-directory.
// When the NextFile is a file a function is called to format
// the output in the textFile, like this:
fwprintf (textF, L"%ls\t%ls\t%2.2x\t%4d/%02d/%02d/%02d/%02d/%02d \t%9ld.\n",
parentPath, fdf.cFileName,
(fdf.dwFileAttributes & 0x0f),
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond,
fSize);
此时 parentPath 将是一个连接的宽字符串,并且 其他文件属性将是显示的类型。
所以,总结一下:如果我只是编写一个独立的测试,那么所有这些代码都可以完美运行。但是,当代码作为从 Adobe ANE 调用的任务运行时,所有子目录部分的名称都被缩减为小写。我已经测试了文件类型属性的每一种组合——二进制和文本以及编码——UTF-8 和 UTF-16LE,但无论我选择什么配置,结果都是一样的:独立 API 提供大小写正确的字符串,运行作为从 AIR 调用的 dll 中的任务,相同的 API 仅提供小写字符串。
【问题讨论】:
-
您应该使用调试器来检查
FindFirst*函数在这两种情况下返回的内容。如果在 ANE 情况下名称都是小写的,那么 ANE 会以某种方式拦截FindFirst*调用。 -
很难想象 ANE 会修补 FindFirst/NextFile(),但听起来就是这样。可能是处理 Unix 和 Windows 之间差异的一个技巧。不使用 `\\?\` 前缀可能会产生影响。 SHGetFileInfo() 可能会提供一种解决方法。
-
有什么问题?