既存のテキストファイルを保存したい

[戻る]
soto 2002/12/12(木) 11:04:34
先ほどは失礼いたしました。≫woodさん
新規に投稿させていただきます。

今作っているプログラムでは処理内容をテキストファイルに
書き込む処理を行っているのですが
前回の書き込み内容を一旦すべて削除してから処理を開始するために

out_file = fopen("c:\\abc.txt","w");
fclose(out_file);

を書き込むことによって起動時に初期化しています。
ですがこのファイルを誰かが開いていた場合には当然破棄できず
閉じてからプログラムを起動しなくてはならないというのが現状です。

そこで・・・

ファイルを誰かが開いていた状態でも初期化ができるような方法は無いでしょうか?
ここでいう初期化はテキストファイル内の文字がすべて消えた状態で
保存されるということです。(今開いている分は閉じたら失われる)

お願いします。

tib 2002/12/12(木) 13:20:06
そのファイルを開いているプログラムがもし、あなたが改変できるものであるなら、あな
たが今作っているプログラムからそのプログラムに対しメッセージを投げて、ファイルを
closeさせる、という風にするのが現実的だと思います。

tib 2002/12/12(木) 13:29:28
それにしても、本当に他のプログラムがopenしているファイルを初期化しちゃっていいん
でしょうか。そのプログラムにとってファイルが途中で書き換えられることでエラーの原
因になったりしないか心配です。

そのファイルに対してどの程度のセキュリティが必要なのかが解らないので何ともいえま
せんが、私だったら他のプログラムに対し「強制close指示」と共に「読み書き制限及び
制限解除通知」も実装するでしょう。また、「強制close指示」に対して「ちょっと待っ
て/もういいよ」という返答ができるようにするとか、一旦テンポラリファイルに必要な
内容を出力しておいて、強制closeが完了したのを確認した後にファイル名を変更するな
どして読み書きを制限している時間をなるべく短くするような配慮も必要だと思います。

soto 2002/12/12(木) 16:44:52
そうですか・・・

例えば既存のテキストファイルを2重に開きます。
1つのファイルの内容を全部デリートして保存します。
もう一方は開いては居るんですが開きなおしたらすべて消えている状態
ということは出来るんですけどね・・・
手動ですけどこれをプログラムで実行したいだけなのです。

INIファイルを操作する関数などでは全消しっていうのがあるんですけどねぇ・・・
テキストファイルで全消しはないのでしょうか?

アイススケーター 2002/12/12(木) 17:00:22
テンポラリファイルにコピーしてから処理してはだめなんですか。

soto 2002/12/12(木) 17:07:50
テンポラリファイルっていうのは何ですか?
具体的にどうやるのですか?

lr 2002/12/12(木) 17:21:51
聞く前に検索しましょうよ
googleで検索すればサンプルがでてきますよ。

soto 2002/12/12(木) 17:31:51
大変申し訳ありません。
本来投稿すべきものでないものを投稿してしまいました。
失礼しました。

テンポラリファイルとは一時ファイルですよね。
私の行っている処理では一時ファイルとして使っているファイルを
ユーザが開いてみるという可能性もあるという形式を取っています。
ですので本来はtibさんの言うとおり開いている場合は何らかのメッセージを表示し
閉じさせる必要があるのかもしれませんね・・・

ただそのメッセージではなく単純に内容だけを消去する(しかも起動時のみ)
ということをしたかったので今回の質問をさせていただきました。

dairygoods 2002/12/12(木) 17:40:40
そのファイルを見る方のアプリケーションは、
ファイルを表示する際にファイルを開いたままなのでしょうか?

普通は、fopenで開いて内容を読み込んだら、fcloseでファイルを
閉じてしまっても問題ないと思いますが。

sugar 2002/12/12(木) 20:12:05
一時ファイルをユーザが開く、という行為は、通常起こることなのでしょうか。
イレギュラーなケースなのでしょうか。

一時ファイルをユーザが手軽に開けるというのも、いかがなものでしょうか。
一般に、アプリがある処理をする上で一時的に使用するファイルなわけですから、
アプリは、ユーザに知られることなくこっそり生成するなり処理するなり
するものではないかと。
あくまで、一般論で。

wood 2002/12/13(金) 05:54:11
soto さん 結構皆さんいろんなご意見いただけたでしょ
そこでわたしも一言
処理するたびに新しいファイル名で作るのではダメでしょうか
人為的ファイル競合を防ぎたいのならこの方法がお勧めですけど
処理のログを取るようなものなら、なおさらそのように思いますけど

自分の出力したデータは、逆を言えばほかの人に破棄されてもかまわないもの
なのでしょうか
続きの処理とかで出力データが処理される必要はないものですか?

ただのデバック用ならコマンドライン引数にファイル名与えるのも
ひとつの手ですけど

soto 2002/12/13(金) 09:32:12
[[解決]]
多数のお返事ありがとうございます。

処理の流れ/条件を書きますと
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);

NEG(ねぐ) [E-Mail] [HomePage] 2002/12/13(金) 10:17:38
 ファイルサイズを変更(0に)するなら、_filenoと_chsizeを使用するとか。

    _chsize(_fileno(out_file),0);

wood 2002/12/13(金) 10:21:37
だれかが開いているファイルを remove(filename );
しようとすると命令の実行はされるけどエラーで帰ってくるのでは
ないでしょうか
成功したかに見えて実は成功しないケースになると思いますけど

VC1.0 DOSアプリの時はダメだったような気がします

soto 2002/12/13(金) 11:12:26
その通りでした。

気づいたことは・・・
テキストファイルは開いていても消去できる(全部メモリに読み込んでしまうため?)
消去しようと思っているのはCSVファイルで開いていると消去できず
開いている時のファイルサイズの変更もテキストはできるがCSVではエラー

そのファイルにアクセスしているアプリケーションによって違うのかもしれませんね。
#テキストファイルはメモ帳で、CSVファイルはエクセルで開いた状態で実験しました。

困った・・・
やはり通知して閉じて頂くしかないのかもしれませんね・・・
しかももしやと思って試したこの後やる追記処理なんですが
こちらもエクセルによるアクセスがあるとエラーになってしまうことが分かりました。
これでさらに開いているファイルに対して処理を行なうという
考え自体がきつくなってきました。

ちょっと考えて見ます。
ご指摘ありがとうございました。

soto 2002/12/13(金) 17:41:08
むーー、思いつきませぬ・・・
こういう仕様が出ています。

1.100件データの処理結果が1分に1つ出る。
2.30件が終了したらそこまでの処理を見てみたい。
3.エクセルシートで見たい。(CSV形式)
4.1件1分の処理タイムは少しでも狂ってはいけません。

この仕様を達成するためにどのような手法があるでしょうか・・・
「終わるまで待ってください」と説得するしかないのでしょうか!T_T

一応、、、1件の出力結果ごとに1つのファイルを出力するで良いか?
の案は「まとめて見たい」の一言でボツになりました!

tib 2002/12/13(金) 17:52:43
「見てみたいだけ」なら、Excelで開くときに「現時点までのデータファイル」をコピー
し、「参照用コピーファイル」を開く。
...という、運用上の注意だけでも実現できそうですが。

参照用のコピーファイルを作り、開くという動作を別プログラムで実行すればいいだけで
はないでしょうか。適当なタイミングでコピーファイルを削除する機能を組み込む必要も
ありそうですね。

dairygoods 2002/12/13(金) 18:39:12
Excelでしたか。

Excelは普通にファイルを開いた場合ファイルをロックしますが、
読取専用モードで開くと、ファイルをロックしないので好きなようにできます。

もし、Excelの起動をプログラムから行っているのならば、
excel.exe /r [ファイル名]
と/rオプションをつけることにより、読取専用モードで開くことができます。

また、ファイルの属性が読取専用である場合も、
読取専用モードで開きますので、
ファイルを書き込んだ後、すかさず読取専用にしてしまうことでも対処できるでしょう。
#ものすごく絶妙なタイミングでファイルを開かれるとダメですが。

古いスレッドには追加発言できません。