这是我的第一个问题,我正在努力描述它。
我想在NTFS上创建一个测试文件(和更新版本;可能是版本无关的)在NTFS上(也可选择在FAT32上)分区,名称+路径将超过260个字符限制。我知道一些第三方工具可以做到,但我想要一些内置方式。
我处理Firefox中由Firefox中的此类文件引起的错误的问题我需要由开发人员(https://bugzilla.mozilla.org/show_bug.cgi?id=1216766)进行测试。我不想强迫任何人安装第三方工具。我试着想办法:
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命令行/ GUI中。如果它可以完成,那么可能是由于一些错误。
答案 0 :(得分:2)
robocopy
自动支持长路径,因此一个简单的解决方案是在根目录中创建一个长名称(221个字符+)的文件然后说
robocopy c:\ "C:\Program Files (x86)\Mozilla Firefox" longname*
(这里我假设文件的名称以longname
开头。)
答案 1 :(得分:1)
最简单的方法是调用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的任何工具无法打开,复制,移动甚至删除使用超过此限制的路径名创建的文件。您可以删除调用DeleteFile API的文件。
答案 2 :(得分:0)
也许你可以写一个.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%
...
答案 3 :(得分:0)
您可以使用Unicode API版本的Windows API来完成此操作。参见
有关代码的完整说明。
.NET API在很大程度上依赖于Windows API,因此基于这些定义,听起来好像很长的路径是不可能的。但是,Windows文件API提供了一种解决此限制的方法。如果您在文件名前加上&#34; \?\&#34;并调用Windows API的Unicode版本,然后您可以使用长度最多为32K字符的文件名
我怀疑Firefox中表现出错误行为的代码不支持\\?\
前缀。