首页 > 解决方案 > Perl chmod 文件超过 260 个字符限制路径长度

问题描述

我已按照https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation#enable-long-paths-in-windows-10中的说明启用了 Windows 10 长路径-version-1607-and-later 我这样做了,所以我可以在 perl 中对超过 260 个字符的 Windows 最大路径长度限制的文件进行 chmod。

my $ret = chmod(oct(0555), '<path_length_greater_than_260_characters>\somefile.txt');
print "$ret\n";

它无法 chmod,$ret0. 我有哪些选择?

标签: perlwindows-10chmod

解决方案


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

Perl 使用A函数的版本。

您所做的更改仅适用于某些W功能。

如果您选择加入长路径行为,这些目录管理功能将不再具有 MAX_PATH 限制:CreateDirectoryW、CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW。

如果您选择加入长路径行为,这些文件管理函数不再具有 MAX_PATH 限制:CopyFileW、CopyFile2、CopyFileExW、CreateFileW、CreateFile2、CreateHardLinkW、CreateSymbolicLinkW、DeleteFileW、FindFirstFileW、FindFirstFileExW、FindNextFileW、GetFileAttributesW、GetFileAttributesExW、SetFileAttributesW、 GetFullPathNameW、GetLongPathNameW、MoveFileW、MoveFileExW、MoveFileWithProgressW、ReplaceFileW、SearchPathW、FindFirstFileNameW、FindNextFileNameW、FindFirstStreamW、FindNextStreamW、GetCompressedFileSizeW、GetFinalPathNameByHandleW。

您可以使用Win32::Unicode来访问其中的大部分。您还可以使用Win32::APIFFI::Platypus访问它们。


顺便说一句,您还可以通过在路径前加上前缀\\?\(或替换\\\\?\UNC\已经以 开头的路径\\)来绕过限制。例如,某些形式\\?\d:\dir\file将被限制为 32,767 个字符而不是 260 个字符。即使没有启用 OP 中提到的功能,这也有效。也就是说,这也仅适用于W功能。


推荐阅读