Namazu-win32-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: フォルダ名の最後が「表」の場合のインデックス作成



 村井です。
 2バイト目が16進数5CのシフトJIS文字が最後に
付くフォルダ名以下のファイルが無視される現象につ
いて調べてみました。
 mknmzの中ではまずコマンドプロンプトで検索対象
に指定されたフォルダ内の全てのファイル名を読み出
します。このために File::Find というPerl 付属のパ
ッケージを使用していますが、この段階で16進数5C
が最後に付くフォルダ名以下のファイルが無視されて
しまいます。
 File::Find の中では opendir chdir lstat などの
Perlの組み込み関数を使用していますが、最後に16
進数5Cが付くフォルダ名に対し、これらの組み込み
関数がうまく動作しないようです。
 これでは全くのお手上げとあきらめかけましたが、
見よう見まねで試行錯誤の上、 mknmz に以下の変更
を行ったところ、処理できるようになりました。
 変更するのは\namazu\bin\ の中にある mknmz (拡
張子の無いもの、 mknmz.bat ではない)です。これは
Perlのプログラムですが、この中の find_target という
サブルーチンの内部に下記のようなサブルーチン
(x_search)を加えると共に、5行をコメント化し、3行を
追加します。
 このサブルーチンではフォルダ名の最後に16進数5C
が付いても、その後に '/' を付ければ opendir ・・・、
 if (-d ・・・) がうまく動作する事を利用しています。(なお、
16進数5Cで終わるフォルダ名を最初から指定する場合
は、例えば mknmz -s -U -O i:\index i:\正誤表\ のよ
うにすれば可能です。)
 動作は一応チェックしていますが、全体を理解せずに
便宜的な変更を行ったもので、その点ご容赦下さい。

動作環境
 CPU Pentium4 2.0AGHz
 メモリ 1,024MB
 OS  Windows 2000 Professional SP2
 Namazu  2.0.10
 Perl    5.6.1.630
 xpdf   1.00
 Office 2000
 一太郎12
      (使用オプション -s -U -O でインデックス化)
検索対象 Word、Excel、ppt、pdf、一太郎、txt、html
      (現在 18,559文書)


///////////////////////////////////////////////////

	    #
	    # 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);# コメント化


            for my $XS (@subtargets){ # 追加
                 &x_search($XS); # 追加
            } # 追加


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


#追加 ここから
sub x_search($){
   my @xd_names=();
   my $xd_count=0;
   my @x_names=();
   my ($xd0) = @_;
   if ($xd0 =~ /\/\z/ ){      # 最後に'/'が付いていればそのまま
      @xd_names[$xd_count] = $xd0;
   }
   else{      # '/'を付加
      @xd_names[$xd_count] = $xd0 . '/';
   }
   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/;    # "." ".." だったら next
            my $xd2 = $xd1 . $XN;
            if (-f $xd2){       # ファイルの場合はflistに追加
               add_target($xd2, \@flist, \%counts);
               next;
            }
            my $xd3 = $xd2 . '/';
            if (-d $xd3){      # ディレクトリの場合は自分の配列に追加
               @xd_names[$xd_count++]= $xd3;
               next;
            }
            print "Unknown type   $xd2\n";
            next;
         }
      }
      else{
         print "Can't opendir   $xd1\n";
      }
      $xd_count--;
   }
   return;
}
#追加 ここまで


    # uniq @flist
    my %mark = ();
    @flist = grep {$mark{$_}++; $mark{$_} == 1} @flist;

    # Sort file names with consideration for numbers.
    @flist = map  { $_->[0] }
	     sort { $a->[1] cmp $b->[1] }
	     map  { my $tmp = $_; $tmp =~ s/(\d+)/sprintf("%08d", $1)/ge;
		    [ $_, $tmp ] } @flist;

///////////////////////////////////////////////////

  村井 俊文     E-mail:murai.t-fs@xxxxxxxxx