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

在Windows中创建名称超过长度限制的文件,windows,filesystems,filenames,ntfs,maxlength,Windows,Filesystems,Filenames,Ntfs,Maxlength,这是我的第一个问题,我正在尽力描述它 我想在Windows7(以及更新版本;可能独立于版本)中的NTFS(也可以选择FAT32)分区上创建一个测试文件,其名称+路径将超过260个字符的限制。我知道一些第三方工具可以做到这一点,但我希望一些内置的方式 我正在处理的问题是我在Firefox中报告的一个bug,它是由Firefox中的此类文件引起的,需要开发人员进行测试()。我不想强迫任何人安装第三方工具。我尝试了我能想到的方法: echo foo > c:\[long string]\foo.

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

我想在Windows7(以及更新版本;可能独立于版本)中的NTFS(也可以选择FAT32)分区上创建一个测试文件,其名称+路径将超过260个字符的限制。我知道一些第三方工具可以做到这一点,但我希望一些内置的方式

我正在处理的问题是我在Firefox中报告的一个bug,它是由Firefox中的此类文件引起的,需要开发人员进行测试()。我不想强迫任何人安装第三方工具。我尝试了我能想到的方法:

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。如果完全可以做到,那么可能是由于一些错误。

也许您可以编写一个.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%

也许您可以编写一个.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%

您可以使用Unicode版本的Windows API来实现这一点。看

获取完整的代码描述

.NET API严重依赖于Windows API,因此根据这些定义,长路径似乎是不可能的。但是,Windows文件API提供了一种绕过此限制的方法。如果在文件名前面加上“\?\”前缀,并调用Windows API的Unicode版本,则可以使用最长32K个字符的文件名


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

您可以使用Unicode版本的Windows API来实现这一点。看

获取完整的代码描述

.NET API严重依赖于Windows API,因此根据这些定义,长路径似乎是不可能的。但是,Windows文件API提供了一种绕过此限制的方法。如果在文件名前面加上“\?\”前缀,并调用Windows API的Unicode版本,则可以使用最长32K个字符的文件名


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

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

std::wstring filename = L"\\\\?\\C:\\<insert up to 32k characters>";
::CreateFileW( filename.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
               FILE_ATTRIBUTE_NORMAL, NULL );
std::wstring filename=L“\\\?\\C:\\”;
::CreateFileW(filename.c_str(),泛型_WRITE,0,NULL,始终创建,
文件\属性\正常,空);

但是请记住,shell(即Explorer.exe)对路径名施加了260个字符的限制。使用shell或使用的任何工具都无法打开、复制、移动甚至删除使用超过此限制的路径名创建的文件。您可以删除调用API的文件。

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

std::wstring filename = L"\\\\?\\C:\\<insert up to 32k characters>";
::CreateFileW( filename.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
               FILE_ATTRIBUTE_NORMAL, NULL );
std::wstring filename=L“\\\?\\C:\\”;
::CreateFileW(filename.c_str(),泛型_WRITE,0,NULL,始终创建,
文件\属性\正常,空);

但是请记住,shell(即Explorer.exe)对路径名施加了260个字符的限制。使用shell或使用的任何工具都无法打开、复制、移动甚至删除使用超过此限制的路径名创建的文件。您可以删除调用API的文件。

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

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

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

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

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

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

这将创建一个深度嵌套的目录结构,但没有一个目录名超过260个字符。问题作者说:“名称+路径将超过260个字符的限制。”也许他也想要这个?这个问题与此有关。对不起,让我精确一点。在大多数情况下,它将位于目录c:\program files(x86)\mozilla firefox\中,并且必须直接位于该目录中。因此,文件需要包含221个或更多字符。@EricJ:单个目录的名称不可能超过260个字符。NTFS不允许这样做,即使在长路径中也是如此。这将创建一个深度嵌套的目录结构,但任何一个目录的名称都不会超过260个字符。问题作者说:“名称+路径将超过260个字符的限制。”也许他也想这样做?这个问题与此有关,对不起,让我精确一点。在大多数情况下,它将位于目录c:\program files(x86)\mozilla firefox\中,并且必须直接位于该目录中。因此,文件需要包含221个或更多字符。@EricJ:单个目录的名称不可能超过260个字符。NTFS不允许这样做,即使在长路径中也是如此。我在命令行中尝试了这个前缀,但没有成功。我不知道如何编写调用Unicode API版本的脚本(例如在VBS中)。我认为它在命令行中不起作用,因为您必须调用非常特定的API。我在命令行中尝试了该前缀,但它不起作用。我不知道如何编写脚本(例如在VBS中)来调用Unicode API版本。我认为它在命令行中不起作用,因为您必须调用非常特定的API。谢谢!我认为这对Fx开发者来说是一个合适的解决方案:)对不起,我还不能给出你的答案,因为我是新用户。谢谢!我认为这对Fx开发者来说是一个合适的解决方案:)对不起,我还不能给出你的答案,因为我是一个新用户。非常有魅力!非常感谢你。如果你愿意