Namazu-win32-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: フォルダ名の最後が「表」の場合のインデックス作成
- From: "Toshifumi Murai" <murai.t-fs@xxxxxxxxx>
- Date: Wed, 8 May 2002 19:30:05 +0900
- X-ml-name: namazu-win32-users-ja
- X-mail-count: 01356
村井です。
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