C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: テキストファイル作成


(過去ログ 11 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■1977 / inTopicNo.1)  テキストファイル作成
  
□投稿者/ スライム (5回)-(2007/03/12(Mon) 02:00:55)

分類:[C# (Windows)] 

いつもお世話になっています
環境はC#2005でWindowsXPです
テキストファイルが更新されたら、その内容を取得して任意のフォルダに保存をすると言うプログラムを作っています
動かしてみると、変更されたテキストの内容を取得する際に、「他のプログラムで使用されています」と言うエラーが出て終了してしまいます
そこで、変更されたテキストの内容を取得するまで処理を繰り返すにはどうしたら良いのでしょうか?
以下の様なテキストファイル更新時の動作とファイルを作成する記述をしています

private void watch_Changed(System.Objectsource,System.IO.FileSystemEventArgs e)
        {
                string strText;

                switch (e.ChangeType)
                {
                    case WatcherChangeTypes.Changed:
                            StreamReader sr = new StreamReader(e.FullPath,System.Text.Encoding.GetEncoding("Shift_Jis"));
                            strText = sr.ReadToEnd();		//(更新されたテキストの内容を全て取得)
                            sr.Close();

                        ReadLog(strText);
                        break;
                }
        }


private void ReadLog(string o)
        {
                string fn = txt_log.Text;			//(保存するフォルダ名取得フルパス入力 例 "C:\テキスト保存" )
                DateTime dtNow = DateTime.Now;			//(作成時の日付と時間を取得)
                string strNow = dtNow.ToString("yyyyMMddHHmmss");
                string filename = fn + "\\"+ strNow + ".txt";	//(例"C:\テキスト保存\20070301101010.txt")

                if (o != "")
                {
                    FileStream fs = System.IO.File.Create(filename);
                    fs.Close();

                    StreamWriter sw = new StreamWriter(filename, false, System.Text.Encoding.GetEncoding("Shift_Jis"));

                    sw.Write(o);
                    sw.Close();
                }
                else { }
        }

引用返信 編集キー/
■1978 / inTopicNo.2)  Re[1]: テキストファイル作成
□投稿者/ Jitta (287回)-(2007/03/12(Mon) 07:03:55)
No1977 (スライム さん) に返信
> いつもお世話になっています
> 環境はC#2005でWindowsXPです
> テキストファイルが更新されたら、その内容を取得して任意のフォルダに保存をすると言うプログラムを作っています
> 動かしてみると、変更されたテキストの内容を取得する際に、「他のプログラムで使用されています」と言うエラーが出て終了してしまいます
> そこで、変更されたテキストの内容を取得するまで処理を繰り返すにはどうしたら良いのでしょうか?

どの様にしたいでしょう?それは、あなたが決めなければならないことじゃないですか?
あるプロセスが、非排他的に使用していれば、他のプロセスは開くことができません。その間、どの様に処理されて欲しいですか?
それを決めないと、プログラムは書けません。
引用返信 編集キー/
■1980 / inTopicNo.3)  Re[2]: テキストファイル作成
□投稿者/ Hirotow (68回)-(2007/03/12(Mon) 11:18:55)
Hirotow さんの Web サイト
2007/03/12(Mon) 11:19:24 編集(投稿者)

昔似たようなものを作った気がする。
http://mui-style.net/mediawiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2/PABS
もしかしたら参考になるかもしれません。
引用返信 編集キー/
■1985 / inTopicNo.4)  Re[3]: テキストファイル作成
□投稿者/ HiJun (15回)-(2007/03/12(Mon) 13:05:36)
細かい仕様がわからないのでとりあえずですが...
Loop内にtry catchでファイルをオープンして、Exceptionで
「他のプログラムで使用されています」エラーを取得したら、
Loopを抜けずに再度ファイルからデータを取得すればよろしいかと...


引用返信 編集キー/
■1997 / inTopicNo.5)  Re[2]: テキストファイル作成
□投稿者/ Jitta (288回)-(2007/03/12(Mon) 22:49:02)
Jitta さんの Web サイト
No1978 Jitta
> あるプロセスが、非排他的に使用していれば、
「非排他的に」って、何だよ。「排他的に」じゃないかorz


No1985 HiJunさん のレスを通してスライムさん
 それも考えたのですが、キャッチして“すぐに”オープンし直すと、また例外が発生します。この、「リトライまでの時間」を考えるということも含めて、「どの様にしたいでしょう?それは、あなたが決めなければならないことじゃないですか?」としました。

引用返信 編集キー/
■2008 / inTopicNo.6)  Re[3]: テキストファイル作成
□投稿者/ スライム (6回)-(2007/03/13(Tue) 09:14:09)
Jittaさん、HiJunさん、Hirotowさんありがとうございます
返事遅れてすみません
>Jittaさん
リトライ時間を1分取って、もしその間に他のファイルが更新されていたらそれの内容も取得して、それぞれファイルを作成すると言う風に出来ないでしょうか?
引用返信 編集キー/
■2012 / inTopicNo.7)  Re[4]: テキストファイル作成
□投稿者/ HiJun (16回)-(2007/03/13(Tue) 13:03:49)
う〜ん。いまいちやりたいことが見えません。

例えば、ファイル1,ファイル2があり、
ファイル1を見に行ったときに、アクセスできなくて
(他のプロセスで使用中)、1分待ったら、ファイル1を放棄して
ファイル2を参照したいということ?

待つ分に関しては、System.Threading.Thread.Sleepを
使用すればいいだけだと思うけど...
引用返信 編集キー/
■2016 / inTopicNo.8)  Re[3]: テキストファイル作成
□投稿者/ Hirotow (70回)-(2007/03/13(Tue) 15:06:26)
Hirotow さんの Web サイト
もしやとは思ったのですがソースが入っていなかったみたいですね。
すみません。
http://hcm.wankuma.com/data/PABS_2006_11_24.cab
にソースコードを上げておきました。

No1980 (Hirotow さん) に返信
> 2007/03/12(Mon) 11:19:24 編集(投稿者)
>
> 昔似たようなものを作った気がする。
> http://mui-style.net/mediawiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2/PABS
> もしかしたら参考になるかもしれません。
引用返信 編集キー/
■2019 / inTopicNo.9)  Re[5]: テキストファイル作成
□投稿者/ スライム (7回)-(2007/03/14(Wed) 09:07:41)
>HiJunさん
いえ、ファイル1は放棄せずに待ち時間の間にファイル2が更新されていたら、ファイル1とファイル2の両方を参照したいとしたいんです

>Hirotowさん
ありがとうございます、参考にさせて頂きます
引用返信 編集キー/
■2034 / inTopicNo.10)  Re[6]: テキストファイル作成
□投稿者/ 黒龍 (69回)-(2007/03/15(Thu) 11:42:25)
黒龍 さんの Web サイト
つFileWatcher
引用返信 編集キー/
■2039 / inTopicNo.11)  Re[7]: テキストファイル作成
□投稿者/ Hirotow (71回)-(2007/03/15(Thu) 14:38:50)
Hirotow さんの Web サイト
No2034 (黒龍 さん) に返信
> つFileWatcher
楽ですが、使ったところでさして精度は上がらないと聴いた気もするのですが。
# 実は当時知らなかっただけ。
# 過去の遺産ですから。
引用返信 編集キー/
■2040 / inTopicNo.12)  Re[1]: テキストファイル作成
□投稿者/ 電柱一家 (1回)-(2007/03/15(Thu) 14:57:16)
こんにちは&こちらでは初めまして。

いろいろと調べてみたのですが、排他モードで開かれたファイルを操作する
(コピーや読み込む)ことは、一筋縄では出来ないようです。

似たようなことを行っているツールはあるのですが、どうも API フックを
使っているのではないかと思われます。API フックの方法に関しては、
私はやったことないので、詳しい説明は出来ません…
引用返信 編集キー/
■2041 / inTopicNo.13)  Re[2]: テキストファイル作成
□投稿者/ 未記入 (46回)-(2007/03/15(Thu) 16:06:57)
FileWatcherは万能じゃないんで独自の実装と組み合わせで使うことが多いです。
引用返信 編集キー/
■2049 / inTopicNo.14)  Re[3]: テキストファイル作成
□投稿者/ 黒龍 (70回)-(2007/03/15(Thu) 19:37:07)
黒龍 さんの Web サイト
FileSystemWatcherでしたね。すみません。

> 楽ですが、使ったところでさして精度は上がらないと聴いた気もするのですが。
> # 実は当時知らなかっただけ。
> # 過去の遺産ですから。
ポーリングなんかよりはるかに信頼性はあると思います。(てか問題をご存知でしたらご教示ください。これで組んじゃったシステムもあるんで…^^;)

要件がいまいち見えない上にポーリングすべし見たいなムードだったので書かせてもらいました。更新されたらというトリガーがしっかりとあるんでポーリングにはすべきじゃないと思いますが…。
引用返信 編集キー/
■2050 / inTopicNo.15)  Re[4]: テキストファイル作成
□投稿者/ 中博俊 (987回)-(2007/03/15(Thu) 19:47:43)
中博俊 さんの Web サイト
Watcherの問題点としては、すべてのファイルの変更が上がってくるわけじゃないとか、複数回更新されても1回しか上がってこないとかそんな話を聞いたことがあります。
なので、Watcherをトリガとしてポーリングすべしみたいなものだと思ってますが、たぶんそういうことですよね>未記入さん

実際には使ったことないのでわかんないんですけどね。
引用返信 編集キー/
■2055 / inTopicNo.16)  Re[5]: テキストファイル作成
□投稿者/ 未記入 (47回)-(2007/03/15(Thu) 23:44:11)
No2050 (中博俊 さん) に返信
> Watcherの問題点としては、すべてのファイルの変更が上がってくるわけじゃないとか、複数回更新されても1回しか上がってこないとかそんな話を聞いたことがあります。
> なので、Watcherをトリガとしてポーリングすべしみたいなものだと思ってますが、たぶんそういうことですよね>未記入さん

はい。そのとおりでございます。
引用返信 編集キー/
■2057 / inTopicNo.17)  Re[6]: テキストファイル作成
□投稿者/ Jitta (289回)-(2007/03/16(Fri) 06:28:41)
Jitta さんの Web サイト
2007/03/16(Fri) 06:51:04 編集(投稿者)

No2019 (スライム さん) に返信
> >HiJunさん
> いえ、ファイル1は放棄せずに待ち時間の間にファイル2が更新されていたら、ファイル1とファイル2の両方を参照したいとしたいんです
>
 FileSystemWatcher から変更があがってきたら、そのときに対応するのではなく、「操作が必要キャッシュ」にしまう。このとき、登録するファイルがキャッシュ内にあるかどうか検査する(上書きを2回やったらどうなるね)。
 それとは別に、「操作をするスレッド(とかタイマーでも)」を作って、そいつが定時間ごとにシグナルを発行する。シグナル発行のイベントで、実際のコピーを行う。使用中ならキャッシュに残したまま。コピーが成功したら、キャッシュから削除する。

 で、Windows から「終了せよ」指令がきたときとか、どうするかはまた別の問題。


 私は、ユーザ指示で検査に行き、ファイルの更新日付でコピーしなきゃいけないかどうかを判断するように作りましたけどね。
 InternetDisk は、FileSystemWatcher で見ながら、ユーザ指示でコピーを開始するようになっている。しかし、「更新された」フラグを持っていて、前回更新せずに終了したら、起動時に更新するか聞いてくる。


キャッシュ を リスト に置き換えてください
引用返信 編集キー/
■2134 / inTopicNo.18)  Re[6]: テキストファイル作成
□投稿者/ スライム (8回)-(2007/03/20(Tue) 09:18:26)
返事を下さった皆様、返事が遅くなってしまってすみませんでした
FileWatcherは万能じゃないとの事なのでもう一度根本から考え直して見ます
黒龍さんと中博俊さんがおっしゃったポーリングと言うのがどういうものか分かりませんが、勉強しつつやってみたいと思います
Jittaさんの本当に色々なアドバイスありがとうございました
解決と言うわけではないですが、再出発と言う意味合いも兼ねて解決済みにさせて貰います
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -