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”;
の下に
}
を追加。
ごちゃごちゃしてきたので追記に前回改造部分と今回の追加をまとめて載せる。

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

既に絵茶のアニメログに関する問題は無いと思っていたら
ふとアニメログ一覧を見た時に思った。
アニメログのファイル名は日付がくっついた形式になっていますが
(但し月の部分は何故か-1月。1月だと0月になる)
年がくっついてません。
つまり、去年と同じ日にアニメログを作ってしまうと上書きされてしまう。
2年間も絵茶運営しながらそんな事に気付かなかった。
さすが私。
というわけで、早速一覧作成するcgiを再び改造する事に。
以前の改造はこちら → PCHViewer Assist CGI
以前は、絵茶3.56に存在するバグにより
アニメログが正常に再生されないのを修正する改造をしていましたが
今回はそれに加えてファイル名に年数をつけて
1年後にファイル名が同じになっても上書きされないようにします。
というわけで、ヘッダ情報を埋め込んで上書きする際に
上書き→ファイル名変更→ファイル閉じる
という工程で完了…って思ったら
Windowsマシンのせいなのか、ファイル名が変更できませんとエラーメッセージ。
仕方が無いので、今度はファイルを一旦コピーして、そのコピーファイル名に年数つけるように。
こちらは成功しましたが、何故かファイル一覧に列挙されない。
しかもコピー完了してから前のファイルを削除する命令入れても
ファイルを削除できませんでしたと怒られる。
unlink命令はパーミッション関係なく消すと書いてあるのに…。
そもそもWindowsマシンでパーミッションもクソもないんだが。
アクセス権の設定が必要なのかと思うけど
あまりアクセス権を緩くしてもセキュリティリスクがあがるだけである。
結局現在
・ファイル名変更は実装できず
・コピーファイルは出来る
・でもコピーされた年数付きファイルは一覧に列挙されない
・前のファイルは残ったままになる

と何も進歩しないまま寝る時間になってしまった。
いつもなら解決するまでやってるんだが、何かふとしたきっかけですぐ解決できそうなので
とりあえず保留。