为什么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的情况