在 Windows 中创建名称超过长度限制的文件

Create file in Windows with name exceeding lenght limit

这是我的第一个问题,我正在尽力描述它。

我想在 Windows 7(及更新版本;可能与版本无关)的 NTFS(也可选择在 FAT32 上)分区上创建一个测试文件,其名称+路径将超过 260 个字符的限制。我知道一些 3rd 方工具可以做到这一点,但我想要一些内置的方式。

我正在处理我在Firefox中报告的由Firefox中的此类文件引起的错误,需要开发人员进行测试(https://bugzilla.mozilla.org/show_bug.cgi?id=1216766)。我不想强迫任何人安装 3rd 方工具。我尝试了我能想到的方法:

echo foo > c:\[long string]\foo.txt
echo foo > \?\c:\[long string]\foo.txt
fsutil file createnew c:\[long string]\foo.txt 1

但在这些情况下 Windows 由于限制而失败。

编辑: 文件必须直接放在 Firefox 目录中(大部分为 33-39 个字符),因此文件长度必须超过 221-227 个字符。

Edit2:我选择了 .NET 示例的答案,但我想知道是否可以找到非程序员的方法,纯粹在 Windows 命令中 line/GUI.如果它可以完成,那么可能是一些错误。

也许你可以写一个.bat文件:

@echo off
set LNG = 01234567890123456789012345678901
md %LNG%
cd %LNG%
md %LNG%
cd %LNG%
md %LNG%
cd %LNG%
md %LNG%
cd %LNG%
md %LNG%
cd %LNG%
md %LNG%
cd %LNG%

...

您可以使用 Windows API 的 Unicode 版本来完成此操作。参见

Long Paths in .NET

使用代码的完整描述。

.NET APIs depend heavily on the Windows APIs, so based on these definitions, it may sound like long paths are immediately out of the question. However, the Windows file APIs provide a way to get around this limitation. If you prefix the file name with "\?\" and call the Unicode versions of the Windows APIs, then you can use file names up to 32K characters in length

我怀疑 Firefox 中出现错误行为的代码不支持 \?\ 前缀。

最简单的方法是调用 CreateFile API 的 Unicode 版本,在文件名前加上前缀 \?\:

std::wstring filename = L"\\?\C:\<insert up to 32k characters>";
::CreateFileW( filename.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
               FILE_ATTRIBUTE_NORMAL, NULL );

不过请记住,shell(即 Explorer.exe)将路径名限制为 260 个字符。使用 shell 或任何使用 Shell Path Handling Functions. You can delete the file calling the DeleteFile API.

的工具无法打开、复制、移动甚至删除使用超过此限制的路径名创建的文件

robocopy 自动支持长路径,所以一个简单的解决方案是在根目录中创建一个长名称(221 个字符+)的文件,然后说

robocopy c:\ "C:\Program Files (x86)\Mozilla Firefox" longname*

(这里我假设文件名以 longname 开头。)