堕天使の煉獄
2016-07
23
07:19:04
歴史的経緯いうやつか
某氏のところの夏コミ用お絵かきは、微妙に〆切りが予想よりのんびりで、なんかちょっと間延びした感じになっちゃって、いまいちモチベーションが上がらなくなってしまったりで。
んで、何もしないのもアレだということでPGがりごりと。
書庫ファイル関係で自分的にやりたい処理を一つのソフトで完結出来る用なのを作っちまおうっての。
んで、書庫ファイルの中身のファイル名をリネームについて。
解凍、圧縮回りは7-zip32.dllとかの機能使えば簡単なんだけども、書庫の中身のファイル名を、再圧縮無しで行うのって、それらのアーカイバdllの中のドキュメントみても、存在しないんですよね。
でも実際にそういうこと出来るツールはあるので、どうなってるのだろうということで、アーカイバdllあれば書庫ファイルのフォーマットなんか知らなくてもおkだぜとか思ってたのですが、結局調べてみることに。
したら……
基本的なフォーマットの場合だと
--------------------------------------
ヘッダ(Local file header)
ファイルの圧縮データ
--------------------------------------
……
……
これが書庫内の圧縮された1ファイル分の情報。
それが収録された分だけ続く。
その次に
--------------------------------------
ヘッダ(Central directory header)
--------------------------------------
……
……
と言うのが、これまた格納されたファイルの数だけ並ぶ。
そんでもって、この中に、対応するLocal file headerのアドレスが入っていて、対になっている。
そしてなんでか、Local file headerとCentral directory headerは重複しているデータがかなりある。ファイル名とかファイルサイズとか……。
そして一番最後に
--------------------------------------
ヘッダ(End of central directory record)
--------------------------------------
一つの書庫に一つだけ存在する、普通ならファイルの先頭にあるものなんじゃないの? っていう、書庫ファイル自体のヘッダ。
この中に、Central directory headerの一件目のデータのアドレスなんかが入ってる。
このフォーマットからして、ファイル名変更というのが、さくっと出来るものではない事が判る。
ファイル名はヘッダの中で、文字数を記録しており、各ヘッダの末尾に可変長データとして収録されているので、ファイル名を変更すると、ヘッダの長さが変わり、以降のデータのアドレスが全部ずれてしまうのです。
うーん。
そりゃそうだよな……
ファイルの先頭にヘッダ。ヘッダの中にはヘッダのサイズ(データ部の開始位置算出用)があり、ヘッダの中にファイル名と、データの開始位置とセットのデータがある。
みたいなのだったら、ファイル名とか簡単に変えられるので、そういうソフトはいっぱいあってもおかしくないはずだよな。
出来ないのには理由があるのねと。
で、なんでこんなひちめんどくさい、さらには重複データもおおい格納ファイル一つに対応するヘッダが二つもついてるのか。
こんな変なフォーマットになっているのはなぜかというと、「歴史的経緯」という奴らしい……。
つまるところ、大昔の、1MBちょいのフロッピーに、分割して書庫を記録させる手段としての書庫ファイルという役割から、分割結合出来る用に、それぞれファイルをセル単位で記録して、かつ整合性チェックのためにもう一つヘッダを用意して、二つのヘッダの中の重複データから収録ファイルの整合性のチェックを行う。さらにはファイルの追記のために、書庫全体のヘッダ部は
一番最後に置かれる。(分割した書庫の末尾に追加する時に有効ということなのかな?)
といった、時代背景からのフォーマットなわけで。
現代においては4GB以上のzipも作れるし、HDDの容量も通信速度も遙かに大きくなり、分割する理由もあまりない。
ので、あまりスマートでないと感じるフォーマットになってしまってるわけだ。
あとは、書庫ファイル全体の末尾のヘッダ……最後に可変長のデータがはいってるんだよな……。
なので、末尾から○バイト前(ヘッダサイズ)から読み込む。ってのができないぽ。これはもうちょっと考えて欲しかったな……。
最後の末尾には可変長データのデータ長が入ってるとか……。
なので、結局、先頭からもりもり読んでいくしか手がないんじゃないのかねコレ。
……SMFファイルの読みこみの時も、この歴史的経緯というのがおおかったな……インターネット以前のパソ通時代の、恐ろしく低速な通信速度では、数バイトでも削る事に意味があったので、ものすごくめんどくさい、先頭からちまちまと読み、省略部分を復号したりしなきゃいけない、うっとうしいフォーマットになってたっけか……。
で、実際の所、書庫ファイルの名前の変更を再圧縮なしにどうやるかと言えば……
結局のところ、普通に書庫ファイルをバイナリで読み込んで、ヘッダ部のファイル名を変更し、サイズが変わった分は再計算して、指定アドレスの値も変更して、データ部(圧縮されたファイル)をコピーして、新しい書庫ファイルを別にバイナリで積み上げて作成する。その後変更前の書庫を削除して、変更前の書庫ファイル名に変えて置き換える。
という方法を行うしなかい模様。
再圧縮に比べれば、ちょいと解析+コピーのコストで済むので、軽いは軽いけど、1GBとか越えるような書庫の場合は、どっちにしろ時間がかかる処理ぽですね……。数MB程度なら一瞬だろうけど。
たしかに、書庫ファイル内のリネーム対応してるソフトで、リネームした時の処理時間は、書庫ファイルのサイズに比例してる感じだったっけ。
同じように、書庫内のファイルの削除も、ヘッダとアドレスの書き換えだけで行えるぽですね。
んーそうなると……。
「リネームと削除」
「画像処理」(書庫内画像のリサイズや画像フォーマットの変更など)
とでソフト分けるべきなのかと。
後者の場合は、書庫ファイルのなかの実ファイルのデータのヘッダも読んだりするので(画像サイズとか現在のファイルフォーマットとか)
一覧表示にもそこそこ時間がかかりそう。
また、「画像処理」の方は再圧縮が前提なので、(データ部自体の変更を行うので)
そこでもついでにリネームや削除も行えるわけですが。
リネームや削除目的のために再圧縮必要なのは、非効率だし。
かたや、リネームと削除だけが目的の場合は、ファイルのリストだけで十分だし、ディレクトリ関係の処理も考えると、テーブルビューではなくツリービューも欲しくなるところ。
この二つを混ぜると、結構UIが面倒な感じになりそうで。
でもそうなると、一つのツールで完結させるという当初の目的からは……
その辺UIのデザイン次第でなんとかなるものかもしれないけど、もうちょっと煮詰めてみないとかなぁ。
……しかし結局zipのフォーマットを細部まで調べるハメになってしまった……。
アーカイバのdllのドキュメントだけで事足りるとおもったのに……w
でもzipのフォーマットはまだオープン(とはいえ、亜種が多いのも問題だけど)なので、こうやってバイナリから直接編集と言うことが出来るけど、rarとかは無理だからなぁ。
実際、書庫内リネーム対応してるソフトも、lzhとzipのみしか対応しないみたいな感じだったし。lzhはもう作者さん本人がもう使わないでねと言ってるフォーマットで、日本人が作ったアーカイバであるということになんらかの思い入れがある人以外はもう今後は使われることは無いフォーマットなので除外するとして、結局書庫内ファイルリネームはzipのみ対応すればよいし、基本zip以外の書庫も面倒なのでアーカイバつかってすべてzipで統一してる感じの運用にしているので(2GB越えるようなのはrar使ったりするけど)リネーム&削除はzip形式専用と言うことになるだろう……。
そうなるとやっぱ書庫内画像編集とは、個別のツールにすべきかなぁとか。
書庫内画像編集はアーカイバ対応していれば複数のタイプの書庫に対応できるし。そのへんで取り扱いがかなり違うぽ。
でもなにげに、zipファイルのヘッダは基本リトルエンディアン。文字列はビックエンディアンで、shift-jisだったりutf-8だったりするのだけども。
そこいらへんはsmfファイルの読み込みの経験が生きるなあとかおもたり。
なにげに時代背景とか発生年台もかぶるフォーマットなんだよな。どこか似てる。うっとうしさも(ぉ
それがいわゆる、歴史的経緯というやつなんだなー。と遠い目になっちゃった今日この頃。
んで、何もしないのもアレだということでPGがりごりと。
書庫ファイル関係で自分的にやりたい処理を一つのソフトで完結出来る用なのを作っちまおうっての。
んで、書庫ファイルの中身のファイル名をリネームについて。
解凍、圧縮回りは7-zip32.dllとかの機能使えば簡単なんだけども、書庫の中身のファイル名を、再圧縮無しで行うのって、それらのアーカイバdllの中のドキュメントみても、存在しないんですよね。
でも実際にそういうこと出来るツールはあるので、どうなってるのだろうということで、アーカイバdllあれば書庫ファイルのフォーマットなんか知らなくてもおkだぜとか思ってたのですが、結局調べてみることに。
したら……
基本的なフォーマットの場合だと
--------------------------------------
ヘッダ(Local file header)
ファイルの圧縮データ
--------------------------------------
……
……
これが書庫内の圧縮された1ファイル分の情報。
それが収録された分だけ続く。
その次に
--------------------------------------
ヘッダ(Central directory header)
--------------------------------------
……
……
と言うのが、これまた格納されたファイルの数だけ並ぶ。
そんでもって、この中に、対応するLocal file headerのアドレスが入っていて、対になっている。
そしてなんでか、Local file headerとCentral directory headerは重複しているデータがかなりある。ファイル名とかファイルサイズとか……。
そして一番最後に
--------------------------------------
ヘッダ(End of central directory record)
--------------------------------------
一つの書庫に一つだけ存在する、普通ならファイルの先頭にあるものなんじゃないの? っていう、書庫ファイル自体のヘッダ。
この中に、Central directory headerの一件目のデータのアドレスなんかが入ってる。
このフォーマットからして、ファイル名変更というのが、さくっと出来るものではない事が判る。
ファイル名はヘッダの中で、文字数を記録しており、各ヘッダの末尾に可変長データとして収録されているので、ファイル名を変更すると、ヘッダの長さが変わり、以降のデータのアドレスが全部ずれてしまうのです。
うーん。
そりゃそうだよな……
ファイルの先頭にヘッダ。ヘッダの中にはヘッダのサイズ(データ部の開始位置算出用)があり、ヘッダの中にファイル名と、データの開始位置とセットのデータがある。
みたいなのだったら、ファイル名とか簡単に変えられるので、そういうソフトはいっぱいあってもおかしくないはずだよな。
出来ないのには理由があるのねと。
で、なんでこんなひちめんどくさい、さらには重複データもおおい格納ファイル一つに対応するヘッダが二つもついてるのか。
こんな変なフォーマットになっているのはなぜかというと、「歴史的経緯」という奴らしい……。
つまるところ、大昔の、1MBちょいのフロッピーに、分割して書庫を記録させる手段としての書庫ファイルという役割から、分割結合出来る用に、それぞれファイルをセル単位で記録して、かつ整合性チェックのためにもう一つヘッダを用意して、二つのヘッダの中の重複データから収録ファイルの整合性のチェックを行う。さらにはファイルの追記のために、書庫全体のヘッダ部は
一番最後に置かれる。(分割した書庫の末尾に追加する時に有効ということなのかな?)
といった、時代背景からのフォーマットなわけで。
現代においては4GB以上のzipも作れるし、HDDの容量も通信速度も遙かに大きくなり、分割する理由もあまりない。
ので、あまりスマートでないと感じるフォーマットになってしまってるわけだ。
あとは、書庫ファイル全体の末尾のヘッダ……最後に可変長のデータがはいってるんだよな……。
なので、末尾から○バイト前(ヘッダサイズ)から読み込む。ってのができないぽ。これはもうちょっと考えて欲しかったな……。
最後の末尾には可変長データのデータ長が入ってるとか……。
なので、結局、先頭からもりもり読んでいくしか手がないんじゃないのかねコレ。
……SMFファイルの読みこみの時も、この歴史的経緯というのがおおかったな……インターネット以前のパソ通時代の、恐ろしく低速な通信速度では、数バイトでも削る事に意味があったので、ものすごくめんどくさい、先頭からちまちまと読み、省略部分を復号したりしなきゃいけない、うっとうしいフォーマットになってたっけか……。
で、実際の所、書庫ファイルの名前の変更を再圧縮なしにどうやるかと言えば……
結局のところ、普通に書庫ファイルをバイナリで読み込んで、ヘッダ部のファイル名を変更し、サイズが変わった分は再計算して、指定アドレスの値も変更して、データ部(圧縮されたファイル)をコピーして、新しい書庫ファイルを別にバイナリで積み上げて作成する。その後変更前の書庫を削除して、変更前の書庫ファイル名に変えて置き換える。
という方法を行うしなかい模様。
再圧縮に比べれば、ちょいと解析+コピーのコストで済むので、軽いは軽いけど、1GBとか越えるような書庫の場合は、どっちにしろ時間がかかる処理ぽですね……。数MB程度なら一瞬だろうけど。
たしかに、書庫ファイル内のリネーム対応してるソフトで、リネームした時の処理時間は、書庫ファイルのサイズに比例してる感じだったっけ。
同じように、書庫内のファイルの削除も、ヘッダとアドレスの書き換えだけで行えるぽですね。
んーそうなると……。
「リネームと削除」
「画像処理」(書庫内画像のリサイズや画像フォーマットの変更など)
とでソフト分けるべきなのかと。
後者の場合は、書庫ファイルのなかの実ファイルのデータのヘッダも読んだりするので(画像サイズとか現在のファイルフォーマットとか)
一覧表示にもそこそこ時間がかかりそう。
また、「画像処理」の方は再圧縮が前提なので、(データ部自体の変更を行うので)
そこでもついでにリネームや削除も行えるわけですが。
リネームや削除目的のために再圧縮必要なのは、非効率だし。
かたや、リネームと削除だけが目的の場合は、ファイルのリストだけで十分だし、ディレクトリ関係の処理も考えると、テーブルビューではなくツリービューも欲しくなるところ。
この二つを混ぜると、結構UIが面倒な感じになりそうで。
でもそうなると、一つのツールで完結させるという当初の目的からは……
その辺UIのデザイン次第でなんとかなるものかもしれないけど、もうちょっと煮詰めてみないとかなぁ。
……しかし結局zipのフォーマットを細部まで調べるハメになってしまった……。
アーカイバのdllのドキュメントだけで事足りるとおもったのに……w
でもzipのフォーマットはまだオープン(とはいえ、亜種が多いのも問題だけど)なので、こうやってバイナリから直接編集と言うことが出来るけど、rarとかは無理だからなぁ。
実際、書庫内リネーム対応してるソフトも、lzhとzipのみしか対応しないみたいな感じだったし。lzhはもう作者さん本人がもう使わないでねと言ってるフォーマットで、日本人が作ったアーカイバであるということになんらかの思い入れがある人以外はもう今後は使われることは無いフォーマットなので除外するとして、結局書庫内ファイルリネームはzipのみ対応すればよいし、基本zip以外の書庫も面倒なのでアーカイバつかってすべてzipで統一してる感じの運用にしているので(2GB越えるようなのはrar使ったりするけど)リネーム&削除はzip形式専用と言うことになるだろう……。
そうなるとやっぱ書庫内画像編集とは、個別のツールにすべきかなぁとか。
書庫内画像編集はアーカイバ対応していれば複数のタイプの書庫に対応できるし。そのへんで取り扱いがかなり違うぽ。
でもなにげに、zipファイルのヘッダは基本リトルエンディアン。文字列はビックエンディアンで、shift-jisだったりutf-8だったりするのだけども。
そこいらへんはsmfファイルの読み込みの経験が生きるなあとかおもたり。
なにげに時代背景とか発生年台もかぶるフォーマットなんだよな。どこか似てる。うっとうしさも(ぉ
それがいわゆる、歴史的経緯というやつなんだなー。と遠い目になっちゃった今日この頃。
Sun
Mon
Tue
Wed
Thu
Fri
Sat
01
■
■
なんかこの系の話おおいね最近
02
03
04
05
■
■
夏風邪は馬鹿がひくもの……
06
07
■
■
じめじめ
08
09
■
■
ひさびさに試運転
10
11
12
■
■
時間の使い方を考える。
13
14
■
■
いまいち決定打に欠ける
15
■
■
なんか変なスイッチはいった
16
17
18
[海の日]
19
20
21
22
23
■
■
歴史的経緯いうやつか
24
25
26
27
28
29
30
31
■
■
もうちょっと・・・
total:2076831 t:343 y:396
■記事タイトル■
■年度別リスト■
2024年
2024年12月(0)2024年11月(0)
2024年10月(1)
2024年09月(2)
2024年08月(1)
2024年07月(1)
2024年06月(5)
2024年05月(2)
2024年04月(1)
2024年03月(6)
2024年02月(4)
2024年01月(3)
2023年
2023年12月(3)2023年11月(1)
2023年10月(2)
2023年09月(3)
2023年08月(3)
2023年07月(3)
2023年06月(7)
2023年05月(8)
2023年04月(2)
2023年03月(1)
2023年02月(2)
2023年01月(3)
2022年
2022年12月(4)2022年11月(3)
2022年10月(1)
2022年09月(3)
2022年08月(3)
2022年07月(2)
2022年06月(1)
2022年05月(3)
2022年04月(2)
2022年03月(2)
2022年02月(1)
2022年01月(6)
2021年
2021年12月(8)2021年11月(3)
2021年10月(4)
2021年09月(6)
2021年08月(2)
2021年07月(1)
2021年06月(3)
2021年05月(2)
2021年04月(2)
2021年03月(3)
2021年02月(1)
2021年01月(4)
2020年
2020年12月(3)2020年11月(7)
2020年10月(2)
2020年09月(3)
2020年08月(1)
2020年07月(3)
2020年06月(7)
2020年05月(5)
2020年04月(8)
2020年03月(4)
2020年02月(2)
2020年01月(4)
2019年
2019年12月(1)2019年11月(1)
2019年10月(2)
2019年09月(1)
2019年08月(3)
2019年07月(2)
2019年06月(2)
2019年05月(2)
2019年04月(4)
2019年03月(1)
2019年02月(7)
2019年01月(1)
2018年
2018年12月(1)2018年11月(1)
2018年10月(5)
2018年09月(1)
2018年08月(5)
2018年07月(1)
2018年06月(1)
2018年05月(1)
2018年04月(2)
2018年03月(2)
2018年02月(1)
2018年01月(1)
2017年
2017年12月(2)2017年11月(1)
2017年10月(2)
2017年09月(5)
2017年08月(8)
2017年07月(2)
2017年06月(1)
2017年05月(1)
2017年04月(3)
2017年03月(5)
2017年02月(7)
2017年01月(8)
2016年
2016年12月(7)2016年11月(2)
2016年10月(3)
2016年09月(7)
2016年08月(8)
2016年07月(10)
2016年06月(17)
2016年05月(6)
2016年04月(8)
2016年03月(10)
2016年02月(5)
2016年01月(10)
2015年
2015年12月(7)2015年11月(7)
2015年10月(13)
2015年09月(7)
2015年08月(7)
2015年07月(5)
2015年06月(4)
2015年05月(5)
2015年04月(2)
2015年03月(4)
2015年02月(1)
2015年01月(7)
2014年
2014年12月(12)2014年11月(8)
2014年10月(4)
2014年09月(6)
2014年08月(7)
2014年07月(4)
2014年06月(2)
2014年05月(5)
2014年04月(4)
2014年03月(8)
2014年02月(4)
2014年01月(8)
2013年
2013年12月(15)2013年11月(8)
2013年10月(3)
2013年09月(3)
2013年08月(8)
2013年07月(0)
2013年06月(0)
2013年05月(0)
2013年04月(0)
2013年03月(0)
2013年02月(0)
2013年01月(0)
■レス履歴■
■ファイル抽出■
■ワード検索■
堕天使の煉獄
https://rengoku.sakura.ne.jp
管理人
織田霧さくら(oda-x)
E-mail (■を@に)
oda-x■rengoku.sakura.ne.jp