为什么Windows API函数createDirectoryW在从Perl脚本中使用时会失败?

时间:2015-02-16 07:05:01

标签: windows perl winapi

我正在使用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,但没有创建文件夹。

2 个答案:

答案 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获得的路径。