![](/img/trans.png)
[英]Why does my Perl script halt if CGI module is used after reading from stdin on Windows?
[英]Why does Windows API function createDirectoryW fail when used from a Perl script?
我正在使用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
,但未創建文件夾。
看一下這個例子,對我來說很好用:
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( 如何從Perl創建然后使用長Windows路徑? )
現在有一個出色的模塊Win32 :: LongPath ,使您無需再去研究 Win32::API
(否則,它是非常有價值的)。
因此,請使用Win32::LongPath::mkdirL
。 如果需要將路徑傳遞給外部程序,請使用從Win32::LongPath::shortpathL
獲得的路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.