ディスクへの即時アクセス法

このQ&Aのポイント
  • ディスクへの即時アクセス法について質問があります。
  • ディスク上のファイルを完全に消去するには、ランダムデータに書き換えてから削除するプログラムを作成しましたが、うまくいきません。
  • ランダムデータの書き換え後、すぐに削除するとディスク上のファイルが未だにランダムデータのままで残ってしまいます。ディスクに即座にアクセスさせる方法や書き込み終了の確認手段はありますか?
回答を見る
  • ベストアンサー

ディスクへの即時アクセス法

ファイルの内容を完全消去するため、ランダムデータにまず書き換え、その後、ディレクトリから削除するようなプログラムを作ってみました。 プログラム初心者で HSP3 という言語を使っています。 ところが、書き換え直後に削除したのでは、ディスク上のファイルがランダムデータに置き換わらぬまま、ディレクトリから削除されてしまいます(復元ソフトで内容が見えます)。 恐らくはキャッシュのみが書き換えられ、ディスク上に反映されて無いのだと思います。 所望の結果を得るには、書き換えと削除の間に少なくとも30秒の待ち合わせが必要です。 しかも確証は得られません。 もっと、明示的、強制的に、ディスクにアクセスさせる方法は無いでしょうか。 あるいは、ディスクへの書き込みが終了した事を確認する手段は無いでしょうか。 HSP からは API の呼び出しも行えるようです。 宜しくご指南願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★追記。 >お教えいただいた、FlushFileBuffers() により、 >即座にディスクに書き込めるようになりました。  ↑  出来ましたか。  良かったですね。 ・それではもうちょっとだけAPI関数を教えておきます。  ファイルの日時→SetFileTime()  ファイルの属性→SetFileAttributes()  ファイル名の変更→MoveFile()  上記の3つを使って  (1)ファイルの日時を 1980/01/01 00:00:00 にセット  (2)ファイルの属性をすべてリセット  (3)ファイル名を C:\a のように1文字に変更  (4)ファイルの内容を空にする  (5)ファイルの削除  このステップでファイルの復元をかなり困難にできます。 サンプル: SYSTEMTIME st = { 0 }; FILETIME ft; FILETIME lt; // ファイルのオープン : 省略 : // ファイルのランダム書き込み : 省略 : // ファイル内容を反映 FlushFileBuffers( hFile ); // ファイル内容を空にする SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); SetEndOfFile( hFile ); FlushFileBuffers( hFile ); // ファイル日時を1980/01/01 00:00:00にセット st.wYear = 1980; st.wMonth = 1; st.wDay = 1; SystemTimeToFileTime( &st, &lt ); LocalFileTimeToFileTime( &lt, &ft ); SetFileTime( hFile, &ft, &ft, &ft ); // ファイルのクローズ : 省略 : // ファイル属性をすべてリセット SetFileAttributes( fname, 0 ); // ファイル名の変更(移動) MoveFile( fname, "c:\\a" ); // ファイルの削除 DeleteFile( "c:\\a" ); その他:  上記の手順をHSP用に変換してみて下さい。  ファイル名の変更はルート・パスで存在しない1文字を探して変更します。  その後にファイルを削除する事でファイル名も1文字以外は復元不可能。  ※ファイル名が変更できたときに削除。  ※変更できなかったらfnameを削除すれば良い。

vq100mg
質問者

お礼

再度ありがとうございます。 教えていただきましたAPI関数、試してみました。 「 SetFileTime() や MoveFile()は即座にディスクを書き換えるだろうか。」 より正確に言えば、「 ディスクへの処理が完了するまで関数から抜けないよう になっているか。 プログラムの流れはそこで待ち合わせをするか。」 が気掛かりだったのですが、大丈夫そうですね。 WriteFile()なども、内容の書き換えこそ後回しにせよ、タイムスタンプの更新を 済ませないで、関数を抜けることは無さそうに見えます。ファイルの書換え直後、 FlushFileBuffers()を実行しないで DeleteFile()をした場合ても、削除された ファイルのタイムスタンプは書き換えられているようです。 ファイルの書換え直後、FlushFileBuffers()を実行しないで、SetFileTime() MoveFile()、DeleteFile()と立て続けに行うとどうなるかも見てみました。 削除されたファイル本体の書き換えは不完全でしたが、タイムスタンプやファイル名 は、きちっと変更された後、削除されるようでした。 ありがとうございました。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★最初にHSPは使ったことがありません。 ・このソフトでファイルをどう扱っているか分かりませんが、  APIを呼び出せるならその関数群を使えば即ディスクに内容を  反映するためのFlushFileBuffers()が使えます。  これを実行すれば書き出した内容を確実にディスクに反映できます。  ※でもAPI関数を使うならC/C++言語を使って作ればもっと楽ですけど。 サンプル: #include <time.h> #include <stdio.h> #include <stdlib.h> // メイン関数 int main( int argc, char *argv[] ) {  long size;  FILE *fp;    if ( argc <= 1 ){   printf( "USAGE: wipe.exe <ファイル名> ...\n" );   return 1;  }  for ( argv++ ; --argc > 0 ; argv++ ){   if ( (fp = fopen(*argv,"rb+")) != NULL ){    for ( size = 0 ; fgetc(fp) != EOF ; size++ ){     ;    }    rewind( fp );    srand( (unsigned)time(NULL) );        while ( --size >= 0 ){     fputc( (rand() & 0xFF), fp );    }    fflush( fp );    fclose( fp );    remove( *argv );   }  }  return 0; } 説明:  上記のはC言語でのランダム上書き+削除処理です。  Cコンパイラをお持ちならコンパイルして『wipe.exe』などを作成します。  その後にHSPから外部コマンドを実行させるようにします。  ちなみに引数にはワイプ削除したいファイル・パス名を指定します。  複数指定可能。空白を含むパスにはダブル・クォーテーションで囲んで下さい。 その他: ・上書きの確認メッセージは出ないためHSPでチェックしてからパス名を渡して下さい。  HSPからAPI関数を呼び出すのは面倒です。多分。 ・でもAPI関数を使えばファイル内容の完全消去以外にもファイルの作成日時や  属性、サイズを0に出来るためファイル復元ソフトでも復元できなくなります。 ・単にランダム値を書き込み削除しただけではファイルの日時、属性、サイズが  復元ソフトで分かってしまいます。ファイル名も1文字に変更してから削除すれば  復元ソフトでも削除ファイル名を推測できなくなります。ここまで凝るならね。

vq100mg
質問者

お礼

どうもありがとうございます。 お教えいただいた、FlushFileBuffers() により、 即座にディスクに書き込めるようになりました。 合わせて、Cのサンプルプログラム、および助言もありがとうございました。 とりあえず、Win32 API を使用したHSP2でのファイル操作: http://yokohama.cool.ne.jp/chokuto/urawaza/fileaccess.html をまねて、FlushFileBuffers()を動かしてみました。 fflush( fp )、fclose( fp )、に相当するものは以下のようです。  ご報告まで。 また、この場をお借りまして、検索で連れてこられた方の為に・・・ #include "llmod.as" ; ファイルオープン、ハンドル名取得 getptr pm.0, fname ; ファイル名文字列のアドレス pm.1 = $40000000 ; GENERIC_WRITE (書き込みアクセス) pm.2 = 0 ; 排他モード pm.3 = 0 ; NULL (デフォルトセキュリティ属性) pm.4 = 3 ; OPEN_EXISTING pm.5 = $80 ; FILE_ATTRIBUTE_NORMAL pm.6 = 0 ; NULL dllproc "CreateFileA", pm, 7, D_KERNEL hFile = stat ; ファイルハンドル if hFile == -1 { dialog "ファイルのオープンに失敗", 1 : stop } ; ディスクに書き込み要請 dllproc "FlushFileBuffers", hFile, 1, D_KERNEL if stat == 0 { dialog "書き込み失敗", 1 } ; ファイルハンドルのクローズ dllproc "CloseHandle", hFile, 1, D_KERNEL hFile = 0

関連するQ&A

  • ディスクの領域不足の解決法を教えてください!

    iPodをもらい、機械音痴なりにがんばって活用しています。 たくさん曲が入っていいなぁと思っていたのですが、最近問題がでてきました。 ディスク領域不足 ドライブローカルディスク(C:)のディスクの空き領域が少なくなっています。 古いファイルや不要なファイルを削除してドライブの領域を空けるには、ここをクリックしてください。 と書かれた吹き出しが画面に出てくるのです… その吹き出しをクリックすると、ワードやエクセルなどのプログラムを削除するところに飛ぶようになっています。 これは消したらマズイのでは…?と思うようなプログラムばかりなんです。 そもそも「ファイル」を削除するように言っているのに、「プログラム」を消させるとはどういうことだと疑問に思っている次第です。 しかしそれらの「最終使用日」を見ると、2年前とか、1年前とか… 最近ワード使ったばかりなのに、ずいぶん昔の日付が出てくるんです。 なおかつ「使用頻度」は「高」なので、もう意味がわかりません。 まったく初心者で申し訳ありませんが、よろしくお願いいたします。

  • スキャンディスク&ディレクトリ

    実は、私はあるシュミレーションゲームをやっていましてそのゲームのデータをセーブして、今日続きをやろうとしたら、なんとデータが壊れてロードができないと言われました。なんとか、修復できないかと思い、スキャンディスクをしてみた所何回やっても、「検査は完了しませんでした」と表示されます。 また、データが壊れたのもこれで3度目です。これは、何がいけないのでしょうか?また、データを入れていたファイルもディレクトリが壊れてて、削除できませんといわれてしまいます。これは、何故なんですか?またコマンドプロトを使用しても、上手く消せなかったんですが・・・・

  • hspのファイルコピーと削除

    HSPでファイルコピー・削除をするとき、fxcopyやdeleteがありますがカレントディレクトリ以外にあるファイルをコピー・削除するときはどのように書けばいいのでしょうか?

  • ディスクのクリーンアップ

    ディスクのクリーンアップをすると、 削除に「ダウンロードされたプログラムファイル」の項目がありますが、これは自分でダウンロードしたフリーソフトなどのことでしょうか。それともどんなプログラムファイルでしょうか。 削除していいものか戸惑ってます。 初心者でわかりません。 よろしくお願いいたします。 (win vista)

  • CUI環境でのCプログラム ランダムアクセスが分からない

    CUI環境でのCプログラムを作っています。 data.txtファイルの末尾に文字を追加させるプログラムを作っています。 ---data.txtの中身------- あああ いいいいい うううううううう ええ ------------------------ このdataファイルの末尾にコマンドプロンプトから文字を追加させるには、ランダムアクセスを使えばいいと思うんですが、どのようなプログラムにすれば良いのか分かりません。ランダムアクセスはバイナリファイルでしか使えないのでしょうか?

  • HSP実行ファイルで・・・・

    ようやくHSPのプログラムが完成しました! 実行ファイルを作ったのですが、hspext.asを使っている為にhspext.dllが同じディレクトリにあれば実行出来るもののexe単体をディスクトップに持ってくると 予想通りhspext.dllが見つかりません!となります。 単体のexeファイル一つだけですと見栄えが良くていいな~と思っているのですが、そういうことって出来ますでしょうか? 前に他の方がHSPで作ったのダウンしたことあるんですが拡張プラグイン使いまくっているはずなのに単体のexeファイル一つでしたので出来るんだろうな~?とは思うのですが(そのファイルはインストール無しでした)

  • ディスクのクリーンアップについて・・・

    ディスクのクリーンアップをしようと思いますが削除していいものにはチェックマークを付けるのですが・・・どれを削除したらいいのかわかりません! 1.ダウンロードされたプログラムファイルというものも削除しちゃってい  いのでしょうか? 2.ちなみにその中のファイルの一つにEng001.XEng001・・・というものが  ありますがこれは何をダウンロードしたのか自分でもわかりません! 1、2とも教えてください。 よろしくお願いします。

  • 何もしてないのにディスクの空き容量が減ります。

    何もしてないのにディスクの空き容量が減ります。 あるファイルをダウンロードしようとすると「空き容量が足りません」と表示されたので古いファイルや使ってないプログラムを削除しました。そのときはそれで済んだのですが、その後何もダウンロードしてないのに、「空き容量が少なくなっています」とか「空き容量が足りません」と表示されます。その度にファイルやプログラムを削除しているのですが、しばらくすると上記のメッセージが表示されます。ファイルやプログラムを消す以外に空き容量を増やす方法はありますか?また根本的な解決策はあるでしょうか。

  • ディスククリーンアップについて

    パソコン初心者です。 最近起動が重いのでディスクのクリーンアップをしようとしたところ、「Temporary Internet Files」と「ダウンロードされたプログラムファイル」と「一時ファイル」を削除するように進んだのですが、これらは削除しても良いものなのでしょうか? また426,488KB空きファイルが増量する価値はあるのでしょうか?どなたか詳しい方教えていただけますか?よろしくお願いいたします。

  • チェックディスクについて教えてください

    今日、ファイルを開こうとしたところ「ファイルまたはディレクトリが壊れている・・・」というエラーメッセージがでました。時間をかけ苦労して録画・編集したデータや大切な画像などが開かず、もう泣きたい感じになってます。 神に祈るような気持ちでいろいろ方法を調べたところチェックディスクが有効ではないかと試そうと思います。 チェックディスクの方法は調べたら分かりましたが、分からないことが2つほど出てきました。 チェックディスクをしたいのはUSBのHDDですが、USB接続でも可能なのかということが一つ。そしてもう一つは、チェックディスクのオプションにチェックを入れた後修復・回復にかかるようですが、もし修復・回復を試みてもダメだった場合、そのデータの状態はもっと悪くなるということはないかということです。 ちょっと慎重すぎるかもしれませんが、よろしくお願いします。

専門家に質問してみよう