人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: dingding
●カテゴリ:インターネット ウェブ制作
✍キーワード:いるか エラー テキスト データ データベース
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● GEN111
●23ポイント

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

単純な文字列じゃなくて

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

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

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

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

◎質問者からの返答

ありがとうございます。


2 ● nagasaki07
●23ポイント

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

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

◎質問者からの返答

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

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


3 ● dev_zer0
●22ポイント

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

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


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

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

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


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

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


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

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

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

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

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

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

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

◎質問者からの返答

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

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

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


4 ● dev_zer0
●22ポイント

> >ファイルが正しく生成されたことは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については分かりません

◎質問者からの返答

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

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

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

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

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

で済まそうと思います。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ