我正在使用perl
来处理文件。我们从特定位置复制文件,然后对每个文件进行一些处理,然后将文件复制到处理过的位置。如果在源目标中,如果我们有文件夹,那么我们也将在目标文件夹中创建相同的结构。在perl
脚本中,我们使用createDirectoryw
来创建文件夹结构。
use Win32::API;
use Encode qw(decode encode);
use Encode::Unicode; # GBR
use Symbol qw( gensym );
use Win32API::File qw(CreateFileW OsFHandleOpen CREATE_ALWAYS GENERIC_WRITE);
$cd = Win32::API->new( 'kernel32', 'CreateDirectoryW', 'PP', 'N' );
...
..
..
my $UTF16_dirname = encode( "UTF-16LE", "$dirname\0" );
my $res = $cd->Call( $UTF16_dirname, 0 ) ;
我得到$res as 0
,但没有创建文件夹。
答案 0 :(得分:1)
看一下这个例子,它适用于我:
use strict;
use warnings;
use Win32::API;
use Carp;
use Encode qw( encode );
Win32::API->Import(
Kernel32 => qq{BOOL CreateDirectoryW(LPWSTR lpPathNameW, VOID *p)}
);
my $path = '\\\\?\\c:';
my $counter=255;
while ($counter)
{
my $nextDir="\\testdir".$counter;
$path.=$nextDir;
mk_long_dir($path);
$counter--;
}
sub mk_long_dir {
my $path = shift;
my $ucs_path = encode('UCS-2le', "$path\0");
CreateDirectoryW($ucs_path, undef)
or croak "Failed to create directory: '$path': $^E";
return $path;
}
感谢SinanÜnür(How do I create then use long Windows paths from Perl?)
答案 1 :(得分:1)
现在有一个出色的模块Win32::LongPath,这使得没有必要随意使用(其他优秀且非常宝贵的)Win32::API
。
所以,请使用Win32::LongPath::mkdirL
。如果您需要将路径传递给外部程序,请使用从Win32::LongPath::shortpathL
获得的路径。