- ベストアンサー
インストーラと突然の電源断
VisualStudio2008のVC++でインストーラを作成しています。 ターゲットはXP/Vistaです。 CopyFile()でファイルをコピーして、ショートカットを作成し、レジストリを登録した直後ぐらいで電源断を発生させると、CopyFile()でコピーしたファイルで1Mを越すものがほとんど壊れています。またショートカットも無かったり、あってもショートカットの中身が壊れていたり(ショートカット先無し、作業フォルダも空)、レジストリもキーだけあって中身が無かったりします。 普通、これらの事象についてどうやって解決するのでしょうか? ちなみにCreateFileでキャッシュ無し指定をして書き込んでも、いきなり電源断するとファイルが壊れてしまっていました。 ノートPCだとあまり見られないのですが、デスクトップPCで顕著に見られます。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
やりなおす以外に解決法なんてありませんがな FILE_FLAG_WRITE_THROUGH無しのFILE_FLAG_NO_BUFFERINGだけではデバイス側キャッシュのバイパスまでは指示されないんですよ デスクトップで顕著なのはその所為じゃないですかね
その他の回答 (3)
- aris-wiz
- ベストアンサー率38% (96/252)
>ショートカットの中身が壊れていたり(ショートカット先無し、 >作業フォルダも空)、レジストリもキーだけあって中身が >無かったりします ということに対して、「どこまで動いてどこで停止するか わからない以上なにが起こっても不思議ではない」だから、 インストーラで対処する方法なんて基本的にありませんよっと 書いたつもりですが。。。 >普通、これらの事象についてどうやって解決するのでしょうか? 具体的に、どういう状態で「解決」な(最終的にどうなってほしい) のかを提示せずに、感想だけ言われても困りますし、 「ロールバックする(元の状態に復元できるようにしておく)」 というのは別に何かをコピーしてとっておくという方法だけでなく、 例えばインストーラが作ったレジストリが残っていれば一旦消す など既に行われた作業を無かったことにするという方法です。 >ちょっと質問とズレた回答に思えます。 おそらく、何か勘違いされていると思います。
お礼
他の方の対処は「インストーラで対処する方法」にあたらないでしょうか? また、ロールバックに関する記述は前回と矛盾する上、そのロールバックの処理をするのはインストーラなのだから「インストーラで対処する方法」にあたると思い、この記述自体で矛盾が生じています。 もう少し具体性のある記述をしていただければ、誤解無く伝わるかと思いますが、今のままでは上手く伝わってきません。 インストーラで対処しないでロールバックする方法がどのような方法なのか、それを見た人が組める程度に記述しないと、上記のように混乱するだけだと思います。 申し訳ありませんが、質問に対する回答は締め切らせていただきます。 ありがとうございました。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>普通、これらの事象についてどうやって解決するのでしょうか? 通常、強制電源断による異常な事象は「無かった事」として無視します。 強制電源断によるファイル損傷は、OSそのものの正常動作が保証されない状態ですので、アプリケーションは「そういう状態」に対処する必要はありません。 インストーラを作成する場合は、以下の点にだけ注意して下さい。 「過剰なチェックを行って、インストールもアンインストールも出来ない状態にだけはしない事」 例えば「インストールしようとしたら既にインストール済みだと言われてインストールが続行できず、アンインストールしようとしたら削除すべきファイルが無いとかインストールされてないとか言われてアンインストールが続行できず」と言う状態になると、八方塞りになります(最悪、ユーザーにOS丸ごとの再インストールを強いる事になる) インストーラーの基本は、以下のようになります。 ・インストール済みの場合 インストール済みの場合は、ファイルとレジストリを上書きインストールします。 インストール済みだからと言ってインストールさせないようにしてはいけません。 なお、バージョンダウンの再インストールの場合は、アンインストールを行ってからインストールするようにすます(いきなり上書きインストールしてはいけません。新旧のファイルの整合性が取れなくなります) ユーザーが一部のファイルを間違って手動で削除した時に、上書きインストールで復旧できるようにしておく事が重要です。 ・インストール中の残骸が残っている場合(インストール済みと判断されなかった場合に限る) インストール中の残骸があったら、ファイルとレジストリの残骸を上書きしてインストールを進めます。 なお、上書きしようとしたファイルがロックされていて上書きできない場合のみ、エラーで中断して構いません(と言うか、中断するしかない) 残骸があるからと言ってインストール済みだと判断してはいけません。 アンインストーラーの基本は、以下のようになります。 ・インストール済みの場合(インストール済みと判断した場合に限る) もし、消すべきファイルやレジストリが既に無かったとしても、エラーにしてはいけません。さもないと「消せない残骸」が残ってしまいます。 ・インストールされてない場合 このケースは考慮しなくて構いません。なぜなら、この状態の時はアンインストーラーが存在しません。
お礼
いろいろありがとうございました。 基本的には書かれた事は実装済みです。
- aris-wiz
- ベストアンサー率38% (96/252)
> 普通、これらの事象についてどうやって解決するのでしょうか? > ちなみにCreateFileでキャッシュ無し指定をして書き込んでも どんなことをしてもプログラムがどこまで動いてどこで停止するか わからない以上なにが起こっても不思議ではありません。 普通、電源断などの突発的なイレギュラは 通常業務の中で対処はしない物です。 もし行うにしても、 もしもの時のために、ある程度のソフトウェアでは、 インストール前に必要な(自分がこれから変更する)情報を バックアップし失敗や正常に終了しなかった場合は、 ロールバックして元に戻すなどの方法がとられます。 #これで完全に元通りになるかと言われれば怪しいですが。
お礼
ちょっと質問とズレた回答に思えます。 アップデートやアンインストールにはロールバックは有効でしょうけど、インストールにはあんまり関係ない話題かな、と思いました。
お礼
回答ありがとうございます。 なんて優しい人だ! FILE_FLAG_WRITE_THROUGHをつけたら、確かに確実にディスクに書き込みますね。 ただし、ものすごい遅く、目標性能を大きく下回りました。 やりなおす事にしました。ありがとうございました!