データベースからデータを参照し、テキストファイルを作成するときに、そのテキストファイルが正常に作成されているかチェックする方法は?


そのテキストファイルを外部から読み込むのですが、もし、テキストファイル生成時に、何か起きて、適切な内容でテキストファイルが生成されていない場合、エラー処理をしようと考えています。

しかし、「適切な内容で生成されたか」「ファイルが壊れていないか」をどうやって確認すべきか悩んでいます。

例えば、テキストファイルの末尾に「x=1」という文字列を入れておいて、外部からテキストファイルを読み込んだときにこの文字列があったら正常とみなすのは乱暴すぎますか?

他にいい方法があれば教えてください。

回答の条件
  • 1人2回まで
  • 登録:2007/05/07 18:17:27
  • 終了:2007/05/14 18:20:04

回答(4件)

id:GEN111 No.1

GEN111回答回数472ベストアンサー獲得回数582007/05/07 18:41:40

ポイント23pt

 チェックするのは後から、そのデータベースにアクセスできない状況でしょうか?

 単純な文字列じゃなくて

親譲りの無鉄砲で子供の時から損ばかりしている。
学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。

というテキストに関して、md5 などのハッシュをとって

親譲りの無鉄砲で子供の時から損ばかりしている。
学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。
7ab17b07b04a54973566f78f196c0910

としてハッシュを検証するのがより厳密だと思います。

id:dingding

ありがとうございます。

2007/05/07 20:09:36
id:nagasaki07 No.2

nagasaki07回答回数5ベストアンサー獲得回数02007/05/07 19:48:48

ポイント23pt

http://ja.wikipedia.org/wiki/MD5

md5を用いてテキストファイルとデータベース内のデータを比べることができます。1文字でも違っていたらmd5の値が別の文字列になりますので、一字一句同じかどうかを確かめることができます。

id:dingding

外部からというのは、Flashからテキストファイルを読み込むことを考えています。

そのため、この手法はちょっと適さないような気がします。

2007/05/07 20:10:16
id:dev_zer0 No.3

dev_zer0回答回数332ベストアンサー獲得回数252007/05/07 19:51:10

ポイント22pt

多くのプログラム言語ではファイルの読み書きの前にopenでファイルハンドルを取得し、

closeでファイルのリソースを解放します


ファイルが正しく生成されたことはopen/write/closeが全て正常終了したことで確認できます。

# そのプログラミング言語でサポートしている関数や、オブジェクトのバグや

# OSのシステムコールのバグは考えないこととします。


また、正しく読み込めたかどうかの確認はopen/read/closeが全て正常終了したことで確認できます。

# メモリなどに読み込んだ場合は、メモリ確保が正常終了している確認も必要です


> 例えば、テキストファイルの末尾に「x=1」という文字列を入れておいて、

> 外部からテキストファイルを読み込んだときにこの文字列があったら

> 正常とみなすのは乱暴すぎますか?

そのファイルに「x=1」という文字列が絶対に入る事がない

という仕様なら問題ないと思いますが、汎用的ではありません

そのファイルに「x=1」が入るという仕様変更があった場合

その方法では破綻します。

id:dingding

X=1が絶対に入らなければ、問題ないのあれば、それがいいような気がしてきました。

>ファイルが正しく生成されたことはopen/write/closeが全て正常終了したことで確認できます

これは知りませんでした。この部分でちゃんと生成されていることを確認するようにすれば、読み込みの方ではファイルが壊れてる心配はしなくても大丈夫でしょうか?

2007/05/07 20:13:08
id:dev_zer0 No.4

dev_zer0回答回数332ベストアンサー獲得回数252007/05/08 01:49:41

ポイント22pt

> >ファイルが正しく生成されたことはopen/write/closeが全て

>  正常終了したことで確認できます

スイマセン。これは大嘘です。ポイントは要りません。


少なくともUnixにおいては

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/close.2.html

 > クローズに成功しても、データがディスクに保存されたかどうか

 > は保証されない(カーネルが書きこみを遅延させることがあるので)。

 > ストリームがクローズされるときにバッファをフラッシュするか

 > どうかは、ファイルシステムによって異なる。データが物理的に

 > 保存されることを確かにする必要がある場合には、fsync(2) を

 > 使用すること (この時点ではディスクのハードウェアに依存する)。

とあるので、closeに成功しても、データが物理的に保存されたという訳ではありません。


ではfsync(2)を行えばよいかというと

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fsync.2.html

 > 最近のディスクは大きなキャッシュを持っているため、これは

 > データの完全性 (data integrity) までは保証していない。


 > 基礎となるハードディスクの書き込みキャッシュが有効になって

 > いる場合、 fsync() / fdatasync() から戻ってきたとしても、

 > 実際には永続的な記憶媒体に置かれていないかもれない。


ということで少なくともUnixにおいてはclose(2)が正常終了した

ことをもってデータの完全性を保証できません。

# ではどうすればUnixにおいてデータの完全性を保証するか

# というと、現在の私の知識では回答しかねます

# また、他のOS(Windowsなど)も調査&知識不足です


ただ、苦しい言い訳をさせてもらうと、私が見た多くの実装では

(例えばfileutilsのcpコマンドなど)ではopen/write/closeが

正常終了していたらコマンド自体も正常終了していて、

私の手がけたシステムもそれ以上のチェックは行っていません。


> 読み込みの方ではファイルが壊れてる心配はしなくても大丈夫でしょうか?

書き込みから読み込みの間にファイルシステムが壊れる可能性があります。

また、ファイルが完全であってもメモリ不足等の理由により

完全に読み取れない場合もあります。

「現在」のファイルシステム上に存在するデータを読み込みたい場合、

少なくともopen/read/closeのエラーチェックはすべきだと私は考えます。

openはパスのミスや読み取り権限が無かったりした場合、

read時にはブロックされる可能性やメモリ不足があります。

ファイル読み込み時にcloseエラーになる可能性は思いつきませんが...


「現在」のファイルシステムと書いたのは先ほども書いたとおり、

書き込みと読み込みの間にファイルシステム破壊の可能性があるからです

完全性にどれだけのコストをかけるのかが分かりませんが、

耐障害性を重視するならば、複数のディスクに書き込みを行い、

書き込んだデータを全て読み込み、それら全てが同じデータならば

それは「ほぼ」完全なデータとしても良いと思われます。


それほどの厳密な完全性を求めずにそれなりのコストで完全性を

求めるならば、それぞれのシステムコールが正常終了している

ことをもって完全ということにしてもよいと私は考えますし、

多くのUnixコマンドもそうなっています。

# なお、繰り返しますが、Unix以外のOSについては分かりません

id:dingding

とても詳しい解説ありがとうございます。

とてもためになりました。

ファイルが壊れたら、作り直すという処理にしようと思いますので、

・open/read/closeのエラーチェック

・ファイル末尾に何か文字列入れてチェック

で済まそうと思います。

ありがとうございました。

2007/05/08 11:14:30

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません