先ほどは失礼いたしました。≫woodさん
新規に投稿させていただきます。
今作っているプログラムでは処理内容をテキストファイルに
書き込む処理を行っているのですが
前回の書き込み内容を一旦すべて削除してから処理を開始するために
out_file = fopen(c:\\abc.txt,w);
fclose(out_file);
を書き込むことによって起動時に初期化しています。
ですがこのファイルを誰かが開いていた場合には当然破棄できず
閉じてからプログラムを起動しなくてはならないというのが現状です。
そこで・・・
ファイルを誰かが開いていた状態でも初期化ができるような方法は無いでしょうか?
ここでいう初期化はテキストファイル内の文字がすべて消えた状態で
保存されるということです。(今開いている分は閉じたら失われる)
お願いします。
そのファイルを開いているプログラムがもし、あなたが改変できるものであるなら、あな
たが今作っているプログラムからそのプログラムに対しメッセージを投げて、ファイルを
closeさせる、という風にするのが現実的だと思います。
それにしても、本当に他のプログラムがopenしているファイルを初期化しちゃっていいん
でしょうか。そのプログラムにとってファイルが途中で書き換えられることでエラーの原
因になったりしないか心配です。
そのファイルに対してどの程度のセキュリティが必要なのかが解らないので何ともいえま
せんが、私だったら他のプログラムに対し「強制close指示」と共に「読み書き制限及び
制限解除通知」も実装するでしょう。また、「強制close指示」に対して「ちょっと待っ
て/もういいよ」という返答ができるようにするとか、一旦テンポラリファイルに必要な
内容を出力しておいて、強制closeが完了したのを確認した後にファイル名を変更するな
どして読み書きを制限している時間をなるべく短くするような配慮も必要だと思います。
そうですか・・・
例えば既存のテキストファイルを2重に開きます。
1つのファイルの内容を全部デリートして保存します。
もう一方は開いては居るんですが開きなおしたらすべて消えている状態
ということは出来るんですけどね・・・
手動ですけどこれをプログラムで実行したいだけなのです。
INIファイルを操作する関数などでは全消しっていうのがあるんですけどねぇ・・・
テキストファイルで全消しはないのでしょうか?
テンポラリファイルにコピーしてから処理してはだめなんですか。
テンポラリファイルっていうのは何ですか?
具体的にどうやるのですか?
聞く前に検索しましょうよ
googleで検索すればサンプルがでてきますよ。
大変申し訳ありません。
本来投稿すべきものでないものを投稿してしまいました。
失礼しました。
テンポラリファイルとは一時ファイルですよね。
私の行っている処理では一時ファイルとして使っているファイルを
ユーザが開いてみるという可能性もあるという形式を取っています。
ですので本来はtibさんの言うとおり開いている場合は何らかのメッセージを表示し
閉じさせる必要があるのかもしれませんね・・・
ただそのメッセージではなく単純に内容だけを消去する(しかも起動時のみ)
ということをしたかったので今回の質問をさせていただきました。
そのファイルを見る方のアプリケーションは、
ファイルを表示する際にファイルを開いたままなのでしょうか?
普通は、fopenで開いて内容を読み込んだら、fcloseでファイルを
閉じてしまっても問題ないと思いますが。
一時ファイルをユーザが開く、という行為は、通常起こることなのでしょうか。
イレギュラーなケースなのでしょうか。
一時ファイルをユーザが手軽に開けるというのも、いかがなものでしょうか。
一般に、アプリがある処理をする上で一時的に使用するファイルなわけですから、
アプリは、ユーザに知られることなくこっそり生成するなり処理するなり
するものではないかと。
あくまで、一般論で。
soto さん 結構皆さんいろんなご意見いただけたでしょ
そこでわたしも一言
処理するたびに新しいファイル名で作るのではダメでしょうか
人為的ファイル競合を防ぎたいのならこの方法がお勧めですけど
処理のログを取るようなものなら、なおさらそのように思いますけど
自分の出力したデータは、逆を言えばほかの人に破棄されてもかまわないもの
なのでしょうか
続きの処理とかで出力データが処理される必要はないものですか?
ただのデバック用ならコマンドライン引数にファイル名与えるのも
ひとつの手ですけど
多数のお返事ありがとうございます。
処理の流れ/条件を書きますと
1.一時DATファイルに計算した結果を出力する。(意味の無い数字の羅列)
2.一時DATファイルを加工したものを出力結果とする。(理解可能な表示形式)
3.出力結果はユーザーが任意のタイミングでオープンする。
4.結果のログは残す必要が無く常に最新のファイルが特定の場所に1つ在ればよい
5.当然DATファイルも使いまわす。
6.例え誰かが開いていても処理を行えば最新の状態に更新される。
となっております。
//////////////
少々強引かもしれませんが以下の手法でできました。
開けないならファイル後と消す。ということで・・・
CString filename = c:\\abc.txt;
remove(filename );
FILE *out_file = fopen(filename,w);
fclose(out_file);
ファイルサイズを変更(0に)するなら、_filenoと_chsizeを使用するとか。
_chsize(_fileno(out_file),0);
だれかが開いているファイルを remove(filename );
しようとすると命令の実行はされるけどエラーで帰ってくるのでは
ないでしょうか
成功したかに見えて実は成功しないケースになると思いますけど
VC1.0 DOSアプリの時はダメだったような気がします
その通りでした。
気づいたことは・・・
テキストファイルは開いていても消去できる(全部メモリに読み込んでしまうため?)
消去しようと思っているのはCSVファイルで開いていると消去できず
開いている時のファイルサイズの変更もテキストはできるがCSVではエラー
そのファイルにアクセスしているアプリケーションによって違うのかもしれませんね。
#テキストファイルはメモ帳で、CSVファイルはエクセルで開いた状態で実験しました。
困った・・・
やはり通知して閉じて頂くしかないのかもしれませんね・・・
しかももしやと思って試したこの後やる追記処理なんですが
こちらもエクセルによるアクセスがあるとエラーになってしまうことが分かりました。
これでさらに開いているファイルに対して処理を行なうという
考え自体がきつくなってきました。
ちょっと考えて見ます。
ご指摘ありがとうございました。