在Windows中使用C语言的fopen函数打开长文件名

3
我在使用fopen打开路径超过Windows原生支持的260个字符的文件时遇到了麻烦。 我发现需要在路径前面加上前缀“\\\\?\\”才能处理该文件。我的问题是:这种方法是否仍然适用于fopen?我仍然无法打开文件,但找不到相关信息。我的路径看起来像:
\\\\?\\C:\\Deposit\\Source\\Here_Comes_Now_A_List_Of_Many_Subdirs_And_A_Long_File_Name

由于需要编写跨平台工具,我无法使用Windows API。


你缺少一个 '',正确的应该是 '\?'. 参考链接:http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx#maxpath。Win32命名空间部分特别与你的问题相关。它说明如果在路径前加上该标识符,IO函数将直接将路径传递给驱动程序。 - RedX
不,那是StackOverflow的编辑器。我进行了更正。我需要转义反斜杠。抱歉,是我的错误。 - Rick-Rainer Ludwig
[...]因为文件系统将路径和文件名视为不透明的WCHAR序列,所以我猜它只能与_wfopen等函数一起使用。 - user786653
@Rick: 你在哪个平台上测试?我使用Win7 x64测试表明fopen("\\\\?\\c:\\a-very-long-pathname", "r")正常工作 - 我想知道MS是否在Vista或Win7中删除了CreateFileA()的限制? - Michael Burr
我使用的是WinXP SP3。我将在同事的电脑上检查这个问题。 - Rick-Rainer Ludwig
2个回答

1

更新一下当前状态:我只是引用https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#enable-long-paths-in-windows-10-version-1607-and-later的话:

从Windows 10版本1607开始,常见的Win32文件和目录函数已经移除了MAX_PATH限制。但是,您必须选择新行为。要启用新的长路径行为,必须同时满足以下两个条件:...

这就是:

1. 在应用程序清单中设置<longPathAware>true</longPathAware>(在我的C++ Visual Studio项目中默认不是这样)。我的清单文件如下所示:

<assembly>
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
      <ws2:longPathAware>true</ws2:longPathAware>
    </windowsSettings>
  </application>
</assembly>

我已将其添加到项目选项 -> 清单工具 -> 输入和输出 -> C++ Visual Studio 项目中的其他清单文件中。

2. 在Windows中启用长路径(可以通过注册表完成(在项计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled中设置为1),或者Microsoft表示在本地组策略(项计算机配置 -> 管理模板 -> 系统 -> 文件系统 -> 启用Win32长路径)中,但这对我不起作用)。

有了上述两个配置,您可以简单地使用FILE *f = fopen("../my-very-long-path/my-file.txt")而没有任何限制(例如相对目录和/与\替换工作)。


0

您可以通过条件编译以跨平台的方式解决此限制:

#ifdef WIN32
     myFile = _wfopen( ... )
#else
     myFile = fopen( ... )
#endif

我认为任何非平凡的跨平台项目都必须在某处执行此操作,否则就要使用一个库(如SDL)来执行。


根据文档,_wfopen() 的行为类似于 fopen,除了使用宽字符(https://learn.microsoft.com/de-de/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170)。 - Jesko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接