やっぱりあふぉの子だった

2016年9月19日プログラムのことCGI, PCHViewer Assist CGI, perl

すぐ気付くだろうと思ってじっと眺めてたらやっぱり気付いた。
うん、自分が相当あふぉな子だったのに気付くのに時間がかからなかった。
ファイルオープン中にファイル内容を変更しようとしても変更できないのは当然である。
つまり、プログラム内でファイルオープンして
現在はそのファイルをプログラムが管理してる最中なのに
外部のコマンドによってファイル内容を変更しようとしても
アクセス権が無いのは当然である。
なのにも関わらず、それに気付かずずっとWindows側のアクセス権を弄って見たりと
全く意味の無いことばかりやっていたのである。
ファイルクローズしてからならアクセス権なんて関係なかった。
これでリネームも動くようになったけれど
リネームするとタイムスタンプがリネームされた時間に変わってしまうので
ファイル名自体は2009がついてるのに、2009年のアニメログも2011年最新になってしまう。
というわけで、そこはタイムスタンプをリネーム前のもので上書きする事で解決。
具体的な追加場所は
以前の改造記事 → PCHViewer Assist CGI

#ディレクトリ内ファイルを1つずつ開く
の手前に
$year += 1900;
($atime, $mtime) = (stat(“$pch_file_directory$file_name"))[8, 9];

を追加。
そのSPCH上書き処理下部にある青文字最後の
close(RPFILE); (これは黒いが)
の直下に

rename (“$pch_file_directory$file_name","$pch_file_directory$year$file_name");
utime($atime, $mtime, “$pch_file_directory$year$file_name");
$file_name = “$year$file_name";

を追加する。
そしてその下辺りにある
#表示時間修正処理
$year += 1900;

の$yearの行をコメントアウト(先頭に半角#つけるだけ)。
やっつけ仕事だけど、ここコメントアウトしないと一覧に列挙される日付リストがえらい事になる。
この処理で、以前まで1ファイルずつバイナリ調べていたので
普通の一覧列挙より重かったというのに、コピー、削除処理が加わって更に重くなったけど
バイナリ処理を調べる手前に、ファイル名に年数がついている場合は
既にバイナリ追加処理が終わっているので、スルーするように改造すれば
表示が早くなると思われる。
面倒くさいのでその辺は自分で調べてください
因みに今回、この改造した事で上書きされていたファイルが100近く見付かった。
上書きされる前の全ファイルのバックアップをとっておいて正解だった…。
※1:47分追記
スルーする改造はたった2行追加でおkだったので書いておく。
さっきの
#ディレクトリ内ファイルを1つずつ開く
の上に追加した
$year += 1900;
の下に
if($file_name !~ /$year/) {
を追加。
改造部分の一番下
$file_name = “$year$file_name";
の下に
}
を追加。
ごちゃごちゃしてきたので追記に前回改造部分と今回の追加をまとめて載せる。


$year += 1900;
if($file_name !~ /$year/) {

# ディレクトリ内ファイルを1つずつ開く
($atime, $mtime) = (stat(“$pch_file_directory$file_name"))[8, 9];
open(RPFILE, “$pch_file_directory$file_name") || die “No File : $pch_file_directory$file_name";
binmode(RPFILE);
sysread(RPFILE, $b_buf, $byte);
close(RPFILE);
# 文字バイナリを16進数へアンパック
@pch_hex = unpack(“H*", $b_buf);
# 16進数化した配列を連結して24文字目まで取得
$binText = substr(join(",@pch_hex), 0, 24);
# 436C69656E745F496D616765 → Client_Image
# つまりClient_Imageヘッダがあるか無いか比較
if($binText ne “436c69656e745f496d616765") {
# 無かったらヘッダ情報埋め込み
$spch_data “Client_Image_Width=$width\r\nClient_Image_Height=$height\r\nversion=3\r\n" . $b_buf;
# SPCHファイルに上書き
open(RPFILE, “>","$pch_file_directory$file_name") || die “No File : $pch_file_directory$file_name";
binmode(RPFILE);
print RPFILE $spch_data;
close(RPFILE);
rename (“$pch_file_directory$file_name","$pch_file_directory$year$file_name");
utime($atime, $mtime, “$pch_file_directory$year$file_name");
$file_name = “$year$file_name";

}
}
#表示時間修正処理
# $year += 1900; ← コメントアウト
わけわからんね。
書いてる本人もわけわからんもん。

2016年9月19日プログラムのことCGI, PCHViewer Assist CGI, perl

Posted by メイの人