[Namazu-win32-users-ja 1342] フォルダ名の最後が「表」の場合のインデックス作成例

tk ZZZ zzztk2015 @ gmail.com
2015年 2月 24日 (火) 16:42:19 JST


 はじめまして。ZZZといいます。

WindowsServer2008R2+IIS+namazu2.0.21で使用しています。

既存のフォルダに対してnamazuを構築したため標記の件にあたりました。
以前(といっても10年以上前)、村井さんが示された方法
(http://www.namazu.org/ml/namazu-win32-users-ja/msg02168.html)
がうまくいかなかったため、自分なりに検討してうまく動いております。
改善点等ありましたら、お知らせいただければ幸いです。perlは全くの初心者です。

変更点は村井さんが示された場所と同じです。mknmzの1450行あたり


     # Wanted routine for File::Find's find().
     #
     my $wanted_closure = sub {
  my $fname = "$File::Find::dir/$_";
  add_target($fname, \@flist, \%counts);
     };
     find($wanted_closure, @subtargets) if (@subtargets > 0);

     ### 最後が「表」等、2バイト目が5Cとなる文字がフォルダ名の場合インデックス作成の対象外になる対応
     ### →該当ファイルのフルパスをDOSのDIRで取得し追加する

  ###################追加ここから######################
     if ($English::OSNAME eq "MSWin32" || $English::OSNAME eq "os2") {
            use Encode;
            for my $XS (@subtargets){
               my @xd_names=();
               my $xd_count=0;
               my @x_names=();
               $xd_names[$xd_count] = $XS . '/';
               while ($xd_count >=0) {
                  my $xd1=$xd_names[$xd_count];
                  if (opendir (XDIR,$xd1)){
                     @x_names=readdir XDIR;
                     closedir XDIR;
                     for my $XN (@x_names){
                        next if $XN =~ /^\.{1,2}\z/;
                        my $xd2 = $xd1 . $XN;
                        if (-f $xd2){       #ファイルの場合はスキップ
                           next;
                        }
                        my $xd3 = $xd2 . '/';
                        if (-d $xd3){       #フォルダと判断された場合はフォルダを追加してスキップ
                           $xd_names[$xd_count++]= $xd3;
                           next;
                        }
                        if ($xd2 =~ /\\$/){    #最後のバイトコードが0x5c("\"と同じ)の場合
                         my $FileListing = `dir /A-D /S /B "$xd2"`;
## DOSのDIRで下位フォルダ以下のファイル名フルパスを取得
                         ##0x5c(\)を含む漢字が化けるのを防止するためにいったんUTF8変換する
                         $FileListing=encode('utf8',
decode('shiftjis', $FileListing));
                         $FileListing =~ s/\\/\//g;    ## "\"を"/"に置換
                         $FileListing=encode('shiftjis',
decode('utf8', $FileListing));  ## SJISに戻す
                         my @FileList=split(/\n/, $FileListing);
                         for my $FL (@FileList){
                          add_target($FL, \@flist, \%counts);
                         }
                         next;
                         }
                        print "Unknown type   $xd2\n";
                        next;
                     }
                  }
                  else{
                     print "Can't opendir   $xd1\n";
                  }
                  $xd_count--;
               }
            }
  }
        ###################追加ここまで###################


 } else {
     print STDERR _("unsupported target: ") . $target;
 }
    }


Namazu-win32-users-ja メーリングリストの案内