概要

  • ディレクトリを再帰的に処理するサンプル。

ソースコード

Win32::Unicode::Native 版

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
-
|
|
!
|
!
 
 
# ファイル名のリストアップ, ファイル名の長さ付き
 
use strict;
use warnings;
use utf8;
use Encode;
use Win32::Unicode::Native;
 
my $charsetFile        = 'UTF-8';
 
my $fileNameOut = "FileNames.txt";
my @targetDirs = map { 'D:/' . $_; } qw(
    aaa bbb ccc
);
 
my $prevDir = '';
 
open( my $OUT, '>', $fileNameOut ) or die( "$fileNameOut: $!\n" );
binmode( $OUT, ":encoding($charsetFile)" );
find( \&getName, @targetDirs );
close( $OUT );
 
sub getName
{
    my $args = shift;
    my $curFile = $args->{name};
    my $curDir  = $args->{dir};
    if ( $prevDir ne $curDir ){
        print( "$curDir\n" );
        $prevDir = $curDir;
    }
    printf $OUT ( "%d\t%s\n", length( $curFile ), $curFile );
}
 
# EOF

File::Next 版

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
-
|
|
!
|
!
 
 
 
-
|
|
-
|
!
|
!
 
 
# ファイル名のリストアップ, ファイル名の長さ付き
 
use strict;
use warnings;
use utf8;
use Encode;
use File::Next;
use Path::Class;
use Win32;
 
#my $charsetConsole	= 'UTF-8';
my $charsetConsole    = 'CP932';
my $charsetFile        = 'UTF-8';
 
binmode( STDIN,  ":encoding($charsetConsole)" );
binmode( STDOUT, ":encoding($charsetConsole)" );
binmode( STDERR, ":encoding($charsetConsole)" );
 
my $fileNameOut = "FileNames.txt";
 
# 「RECYCLER」を拾わないように
my @targetDirs = map{ encode( $charsetConsole, 'D:/' . $_ ); } qw(
    aaa bbb ccc
);
 
my $prevDir = '';
my $nextFiles = File::Next::files( @targetDirs );
 
open( my $OUT, ">:encoding($charsetFile)", encode( $charsetConsole, $fileNameOut ) ) 
    or die( "$fileNameOut: $!\n" );
while( defined ( my $file = $nextFiles->() ) ){
    # $file は CP932 エンコードかつ短いファイルネーム
    my $curFile = getUtf8PathName( $file );
    my $curDir = getUtf8PathName( file( $file )->dir );
    if ( $prevDir ne $curDir ){
        print "$curDir\n";
        $prevDir = $curDir;
    }
    printf $OUT ( "%d\t%s\n", length( $curFile ), $curFile );
}
close( $OUT );
 
sub getUtf8PathName
{
    my $path = shift;
    $path = Win32::GetLongPathName( $path );
    if ( ! Encode::is_utf8( $path ) ){
        $path = decode( $charsetConsole, $path );
    }
    return $path;
}
 
# EOF

自前で再帰版

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
-
-
|
|
-
|
|
!
!
!
 
 
#!/usr/local/bin/perl
 
# カレントディレクトリ以下の全てのファイルを処理する。
 
recursive( '.' );
 
exit();
 
##### Subroutine
 
# 再帰的にコピーする
# @param[in]	$sBaseDir	基準となるディレクトリ
sub recursive
{
    my( $sBaseDir ) = @_;
    my( @FileLists, $sFileName );
 
    @FileLists = glob( $sBaseDir.'/*' );
 
    foreach $sFileName ( sort( @FileLists ) ){
        if ( -d $sFileName ){
            # ディレクトリだったら再帰呼び出し
            &recursive( $sFileName );
        } elsif ( -f $sFileName ){
            # ファイルだったら処理する
            print( $sFileName . "\n" );
        }
    }
}
 
# EOF
  • CPAN:File-Next
    • Windows では、「RECYCLER」のようなシステム管理フォルダにアクセスして失敗することがある。
    • ロングファイルネームではなく、8.3 形式の短いファイル名を返す。

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Tue, 24 Jun 2014 04:16:44 JST (1304d)