Windows 具有unicode文件名的fopen
我必须使用一个库,它接受文件名作为字符串(Windows 具有unicode文件名的fopen,windows,winapi,visual-c++,Windows,Winapi,Visual C++,我必须使用一个库,它接受文件名作为字符串(constchar*)。使用fopen打开内部文件。有没有办法让这个库接受unicode文件名?在将unicode名称传递到库之前,我可以使用将其转换为utf吗 一种可能的(不希望的)解决方案是更改库接口(char*->wchar\u t*),并用windows特定的\u wopen替换fopen。另一种解决方案是使用创建指向文件的符号链接并将其传递到库,但它仅限于NTFS卷。最好的方法是重写库。。。只要我的2美分 但如果它即将打开一个现有文件,您可以使
constchar*
)。使用fopen
打开内部文件。有没有办法让这个库接受unicode文件名?在将unicode名称传递到库之前,我可以使用将其转换为utf吗
一种可能的(不希望的)解决方案是更改库接口(
char*->wchar\u t*
),并用windows特定的\u wopen
替换fopen
。另一种解决方案是使用创建指向文件的符号链接并将其传递到库,但它仅限于NTFS卷。最好的方法是重写库。。。只要我的2美分
但如果它即将打开一个现有文件,您可以使用
您可以找到关于这种方式的现有讨论。使用WideChartMultiByte,您只能打开文件名仅包含ANSI字符的文件。这是因为文件函数的ANSI变体(使用“char*”类型参数)无法打开文件名中包含255以上字符的文件 使用GetShortPathName的缺点是,它可能无法在不支持“8.3”文件名的某些文件系统(可能是某些类型的网络驱动器)上工作 我将使用“\uwfopen”函数重写该库(UNICODE等效的“fopen”是“\uwfopen”,而不是“\uwopen”)
请注意,“fopen”的第二个参数在使用wfopen时也必须是UNICODE字符串。您不能使用
wideChartMultiByte
转换为UTF-8,因为Windows的窄字符char
函数不支持UTF-8。它们只支持本地编码(并非所有Unicode字符都可以表示)。将库接口更改为使用wchar\u t
是Windows上的典型操作。GetShortPathName
并不表示ASCII字符。也可以在特定卷上禁用短文件名别名。此外,GetShortPathName
在您没有查询父目录权限的情况下可能会失败。有关更多信息,请参阅。我已经添加了有关帽子问题的链接和讨论!不是吗?您提供的链接没有提到我描述的故障模式:当系统无法查询父目录时检索短文件名失败。不需要得到所有的嘶嘶声。我添加了两个链接!第二部分解释了失败和问题。第二部分详细说明了如何使用以下名称防止8.3短名称中的NTFS:NtfsAllowExtendedCharacterIn8dot3Name。又是这样?我的答案漏掉了什么?这变得越来越乏味:您提供的第二个链接没有说明我已经指出过两次的失败模式:调用GetShortPathName可能会因访问冲突而失败,即使您拥有对相关文件的完全访问权。