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

为什么Windows API函数createDirectoryW在从Perl脚本使用时失败?,windows,perl,winapi,Windows,Perl,Winapi,我正在使用perl对文件进行一些处理。我们从特定位置复制文件,对每个文件进行处理,然后将文件复制到处理位置。如果在源目标中,如果我们有文件夹,那么我们也将在目标文件夹中创建相同的结构。在perl脚本中,我们使用createDirectoryw创建文件夹结构 use Win32::API; use Encode qw(decode encode); use Encode::Unicode; # GBR use Symbol qw( gensym ); use Win32API::F

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

看看这个例子,它对我来说很好:

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()

现在有了一个优秀的模块,不必再胡闹(其他方面都很优秀,也很宝贵)
Win32::API


因此,请使用Win32::LongPath::mkdirL。如果需要向外部程序传递路径,请使用从
Win32::LongPath::shortpathL

获取的路径,始终使用
use strict
use warnings
。添加了strict和warnings,之后我在下面的语句$cd=Win32::API->new('kernel32',CreateDirectoryW',PP',N')中出错;错误-全局符号“$cd”需要明确的软件包名称是的,您应该使用
my
关键字声明
$cd
,因为您使用的是
strict
。您的代码对我来说运行良好。我想您需要向我们展示更多的代码(带有$dirname初始化的行),下面是子创建长路径($){my$path=shift;my($root,$subdirs)=$path=~/^(\w:\\\w+(.*)$/;$p='\\\\?\'.$root;\$p=$root;long\u mkdir($p);my@T\\\\\\u subdirs=split/\\\/,$subdirs;用于我的$subdir(@T\\\\\/,$subdirs){if($subdir-ne”“){$p.='\\'.$subdir;long_mkdir($p);}}}}}……..sub long_mkdir($){my$dirname=shift;#生成UTF-16LE字符串my$UTF16\u dirname=encode($UTF-16LE,“$dirname\0”);my$res=$cd->Call($UTF16\u dirname,0);返回$res;}当我研究这个问题时,没有:这是一个优秀的模块。另请参阅。perl脚本在我的环境中运行良好,当我尝试在另一个perl环境中运行时,它失败了。得到以下错误,CreateFile:系统找不到指定的路径。我已在所有环境中安装了活动的perl 5.12.4,是否存在错误缺少任何东西?我已使用perl2exe在64位机器上创建了perl exe,并尝试在32位机器上运行该exe。CreateDirectoryW在32位机器上不工作,但在64位机器上工作。有什么原因吗?@Karthik SV:请检查procmon的情况