簡體   English   中英

從Perl腳本使用Windows API函數createDirectoryW為什么會失敗?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM