Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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 具有unicode文件名的fopen_Windows_Winapi_Visual C++ - Fatal编程技术网

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可能会因访问冲突而失败,即使您拥有对相关文件的完全访问权。