Perl chmod文件超过260个字符的限制路径长度

Perl chmod文件超过260个字符的限制路径长度,perl,windows-10,chmod,Perl,Windows 10,Chmod,我已经按照上的说明启用了Windows 10长路径 我这样做是为了能够在perl中创建超过260个字符的Windows最大路径长度限制的chmod文件 my $ret = chmod(oct(0555), '<path_length_greater_than_260_characters>\somefile.txt'); print "$ret\n"; my$ret=chmod(oct(0555),'\somefile.txt'); 打印“$ret\n”; 它

我已经按照上的说明启用了Windows 10长路径 我这样做是为了能够在perl中创建超过260个字符的Windows最大路径长度限制的chmod文件

my $ret = chmod(oct(0555), '<path_length_greater_than_260_characters>\somefile.txt');
print "$ret\n";
my$ret=chmod(oct(0555),'\somefile.txt');
打印“$ret\n”;
它无法chmod,
$ret
0

我的选项是什么?

每个函数有两个版本,接受/返回字符串,一个是a(NSI)版本,接受/返回使用ANSI/活动代码页编码的字符串,另一个是W(ide)版本,接受/返回使用UTF-16le编码的字符串

Perl使用函数的
版本

您所做的更改仅适用于某些
W
函数

如果选择长路径行为,则这些目录管理函数不再具有MAX_路径限制:CreateDirectoryW、CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW

如果选择长路径行为,则这些文件管理功能不再具有最大路径限制:CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2、CreateHardLinkW、CreateSymbolicClinkW、DeleteFileW、FindFirstFileW、FindFirstFileExW、GetFileAttributesW、GetFileAttributesW、SetFileAttributesW、,GetFullPathNameW、GetLongPathNameW、MoveFileW、MoveFileExW、MoveFileWithProgressW、ReplaceFileW、SearchPathW、FindFirstFileNameW、FindFirstStreamW、FindFirstStreamW、GetCompressedFileIzew、GetFinalPathNameByHandleW

您可以使用来访问其中的大多数。您也可以使用或访问它们


顺便说一句,您还可以通过以下方法绕过限制(或将已以
\\
开头的路径的
\\
替换为
\?\UNC\
)。例如,形式为
\\?\d:\dir\file
的内容将被限制为32767个字符,而不是260个字符。即使没有启用OP中提到的功能,它也可以工作。也就是说,它也只适用于
W
功能。

,您可以使用。从模块的大纲中:

使用File::Spec::Functions;
使用Win32::LongPath;
使用utf8;
#使用世界各地的Unicode创建一条非常长的路径
$path='c:';
while(长度($path)<5000){
$path=catdir($path,'ελληνικά-цСцц-日本語-한국-中國的-עִברִית-عربي');
如果(!testL('e',$path)){
mkdirL($path)或die“无法创建$path($^E)”;
}
}
打印“短路径:”。shortpathL($path)。“\n”;
#接下来,在路径中创建一个文件
$file=catfile(‘更有趣的字符’-தமிழர்-​ພາສາ​ລາວ');
openL(\$FH,'>:编码(UTF-8)',$file)
或死亡(“无法打开$file($^E)”);
打印$FH“写入更多Unicode字符\n”;
打印$FH“דאסשריבאַשךיִיששבבאיש”字样;
收盘价$FH;
#现在撤销一切
取消链接($file)或“无法删除文件($^E)”;
而($path=~/[\/\\]/){
rmdirL($path)或die“无法删除$path($^E)”;
$path=~s#[/\\][^/\\]+$\35;;
}
对于Windows上的
chmod
,请注意以下注意事项:

(Win32)仅适用于更改“所有者”读写访问;“组”和“其他”位没有意义


有关设置Windows特定文件访问权限的信息,请参阅和。我没有使用该模块,但在这里可能会有所帮助。

路径的一个长文件名是否超过260个字符?或者您可以将路径分解为目录、子目录和基文件名吗?然后您可以沿路径向下移动
chdir
,直到剩余路径长度为不到260。我忘了提到Perl使用函数的重要一点。Perl使用函数的
A
版本。我使用的是草莓Perl v5.32.0。在Win32::Unicode安装过程中,我遇到了一些测试失败。我继续运行Perl脚本,在@INC中得到消息
找不到Win32/Unicode.pm(您可能需要安装Win32::Unicode模块)
@ontherocks您可以使用
cpan Win32::Unicode
@ontherocks安装该模块如果您遇到的唯一测试失败是
t/04_print.t
,则强制安装模块(
cpan-f Win32::Unicode
)。这是
printW
的问题。它不会妨碍其他函数的使用。大多数情况下,它甚至不会妨碍
printW
的使用。同样,
chmod
在Windows上没有任何意义