Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows SHParseDisplayName失败,当传递名称以空格字符结尾的现有目录时,出现错误\u FILE\u NOT \u_Windows_Winapi - Fatal编程技术网

Windows SHParseDisplayName失败,当传递名称以空格字符结尾的现有目录时,出现错误\u FILE\u NOT \u

Windows SHParseDisplayName失败,当传递名称以空格字符结尾的现有目录时,出现错误\u FILE\u NOT \u,windows,winapi,Windows,Winapi,我正在开发一个文件管理器应用程序,注意到一些函数不能与以空格符号结尾的现有文件夹一起使用。例如。“E:\1\”。这并不是特定于此特定文件夹的,而是特定于文件夹名称最后一个字符为空格的任何文件夹。对于此类文件夹,SHParseDisplayName返回ERROR\u FILE\u NOT\u FOUND 我正在用C++调用SHParseDisplayName就像这样: ITEMIDLIST* idPtr = nullptr; const auto result = SHParseDisplayNa

我正在开发一个文件管理器应用程序,注意到一些函数不能与以空格符号结尾的现有文件夹一起使用。例如。“E:\1\”。这并不是特定于此特定文件夹的,而是特定于文件夹名称最后一个字符为空格的任何文件夹。对于此类文件夹,
SHParseDisplayName
返回
ERROR\u FILE\u NOT\u FOUND

我正在用C++调用
SHParseDisplayName
就像这样:

ITEMIDLIST* idPtr = nullptr;
const auto result = SHParseDisplayName(L"E:\\1 \\", nullptr, &idPtr, 0, nullptr);
没有指定任何边缘情况,也没有指定任何预处理输入路径的方式。不管怎样,我试着用引号来装饰它:

SHParseDisplayName(L"\"E:\\1 \\\"", nullptr, &idPtr, 0, nullptr);
以及提供UNC路径:

SHParseDisplayName(L"\\\\?\\E:\\1 \\", nullptr, &idPtr, 0, nullptr);
这两种情况都会导致
E_INVALIDARG

注意:
SHParseDisplayName
对于嵌套在这样一个文件夹中的项目,例如。g
L“E:\\1\\some\u internal\u folder\\”
,而不是名称以空格结尾的文件夹本身

有什么解决办法吗?Windows资源管理器似乎可以很好地处理这些文件夹(正如人们所期望的那样)

此外,
SHParseDisplayName
并不是唯一一个针对此类文件夹失败的Windows API函数。相同行为的另一个示例是
ILCreateFromPathW

以ASCII空格(0x20)开头或结尾的文件和文件夹名称 将在不使用这些字符的情况下保存。结束的文件和文件夹名称 使用ASCII句点(0x2E)时,也将保存字符,而不保存此字符 性格所有其他尾随或前导空格字符都是 保留

Win32 API(CreateFile、FindFirstFile等)使用直接方法 枚举本地或远程文件系统上的文件和文件夹。 无论是否包含,所有文件和文件夹都是可发现的 空白字符的位置

参考“”

和博客”


因此,对于名称末尾有空格的现有文件/文件夹,可以使用Win32 API(CreateFile、FindFirstFile等)或者用不带尾随或前导空格字符的新名称替换它们。

是否确定资源管理器?如果我尝试重命名文件夹以在末尾加空格,它将忽略它。@JonathanPotter:我没有尝试过。我用文件管理器创建了文件夹,资源管理器可以显示该文件夹的工具提示、上下文菜单、回收文件夹等。这些操作在此特定文件夹的“我的管理器”中不起作用。资源管理器不允许您创建一个末尾带有空格的文件夹,这表明您的应用程序也不应出现此问题。从win32 dos路径转换时出现问题没有nt路径。如果路径结尾带有空格,则会删除它。结果是名称错误-找不到文件。但如果您在结尾处设置\在空格之后-则会删除它在这种情况下转换的ect Windows资源管理器似乎可以很好地处理这样的文件夹-我不是说。只能部分工作。甚至只有在第二次双击后才能进入文件夹。无法重命名/删除等。win32 nt路径转换中存在问题。这样的转换最终会删除空间。\\?\只在此处工作,因为它被替换为\?\和其他pa这不是用这个前缀解析的。SH函数+额外的问题层-它根本不支持\\?\。因此,在win32 api中,这样的路径路径总是会有问题!奇怪的是,对于以空格开头的文件夹,只有以空格结尾的文件夹,我的问题(如果有的话)要少得多。