NasupiiのPerl書抜帳

Windows専用ファイル一覧作成プログラムソースコード



#####################################################################################################
# file_list_w.pl ver.1.1
#
# このプログラムは S-JIS で記述すること。UTF-8で記述すると文字化けエラーとなる。
#
# Windows専用ファイル一覧表作成プログラム
#
#  Copyright (C) Nasupii
#
# 2010/12/12 初版作成。(ver.1.0)
# 2023/12/29 S-JIS で記述すること等の注記を追記した。use strict; と use warnings; を追加し 
#            my ですべての変数を宣言した。(ver.1.1)

#####################################################################################################

# 動作確認環境
#   Strawberry Perl 5.36.1.1 がインストールされた Windows 10 にて動作確認した。
#   初版作成時に動作確認した Perl ver.5.10 以降なら、たぶん動作するでしょう。
#   初版作成時に動作確認した Windows XP以降なら、たぶん動作するでしょう。
#   linux では動作しない(Windows のdirコマンドを呼び出しているので)。

# 使用方法
#   このプログラムを調べたいファイルがあるフォルダにコピーし、ダブルクリックする。
#   フォルダー内及びその下位フォルダー内のすべてのファイル一覧表をタブ区切りテキストファイルで
#   書き出します。
#   書き出すファイル名は、"file_list.txt"です。書き出す場所はカレントフォルダーです。
#   プログラムをメモ帳などで開いて $path = '.'; となっているところを書き換えると、
#   カレントフォルダー以外 のファイル一覧表を作成することも出来ます。

# 動作の説明
#   Windows のdirコマンドをperlから呼び出して、指定したフォルダーおよび
#   その下位フォルダーに含まれるファイルの一覧表を得る
#   ファイル名はドライブ名まで含めたフルパス名で出力される。
#   ただしフォルダの区切り文字はperlで扱いやすいように \ を / に変えている。
#   出力される書式は
#   ファイル名[tab]ファイル名拡張子[tab]最終書き換え日時[tab]ファイルサイズ(単位byte)
#   例 c:/test/a/abc.txt[tab]txt[tab]2008/05/06 08:24[tab]1235[return]
#   注 [tab]はタブ記号を、[return]は復帰改行をあらわす
#   フォルダーの指定は 変数 $path に代入することで行う
#   結果はカレントフォルダーに filelist.txt のファイル名で書き出す
#   同じファイル名が存在した場合は上書きされる
#   タブ区切りテキストファイルとして表計算ソフトにそのまま読み込むことが出来る
#   フォルダーの指定はカレントフォルダーからの相対パスでもよいが、
#   結果は必ず絶対パスで出力される。(dirコマンドの仕様によるもの)

#####################################################################################################

use strict;
use warnings;

my ($path, $command, $line, $date, $size, $name, $ext);

$path = '.'; #この行でフォルダーを指定する。'.' はカレントフォルダーを表す。

$path = sl2bksl($path); # /区切りで指定された場合は \ 区切りに書き換える
$command = 'dir /s /on /tw /-c "' . $path . '" |';
open(IN, $command);
open(OUT, ">file_list.txt");
print OUT "ファイル名\t拡張子\t更新日\tサイズ\n";

while($line = <IN>) {
  $line =~ s/\n//;
  if($line =~ m/ (.+) のディレクトリ/) {
     $path = bksl2sl($1);
  }elsif($line =~ m|^(\d\d\d\d/\d\d/\d\d)\s+(\d\d:\d\d)\s+(\d+) (.+)$|) {
     $date = "$1 $2";
     $size = $3;
     $name = $4;
     if($name =~ m|\.(.+?)$|) {
       $ext = $1;
     }else{
       $ext ="";
     }
     print OUT "$path/$name\t$ext\t$date\t$size\n";
  }
}
close(IN);
close(OUT);
exit;

#####################################################################################################
sub bksl2sl {
# 文字列中の \ を / に変更 S-JIS 専用
# 引数  変更前の文字列
# 戻り値 変更後の文字列
# 引数で与えられた文字列中に含まれる \ を / に変更する
# Windows のパス名をperl用に変更するのに用いる
# 例 引数  c:\test\一覧表.txt
#     戻り値  c:/test/一覧表.txt

  my($i, $b);
  $b = $_[0];
  for($i = 0;$i<length($b);$i++) {
#    print substr($b,$i,2), "\n";
    if(substr($b,$i,1) =~ m/[\x81-\x9f\xe0-\xfc]/) {
      $i++;
    }elsif(substr($b,$i,1) eq "\\") {
       substr($b,$i,1) = "/";
    }
  }
  return($b);
}

#####################################################################################################
sub sl2bksl {
# 文字列中の / を \ に変更 S-JIS 専用
# 引数  変更前の文字列
# 戻り値 変更後の文字列
# 引数で与えられた文字列中に含まれる \ を / に変更する
# perl のパス名をWindows用に変更するのに用いる
# 例 引数  c:/test/一覧表.txt
#     戻り値  c:\test\一覧表.txt

  my($b);
  $b = $_[0];
  $b =~ s!/!\\!g;
  return($b);
}


Copyright (C) Nasupii