ふらっとC#,C♯,C#(初心者用) Part70

このエントリーをはてなブックマークに追加
261こごろう
WindowsForm アプリケーションを作成しています。
@
各端末で日記を登録できるようにする。
保存先は、ネットワーク上のある端末またはサーバーの共有フォルダとし、テキスト形式で保存するようにする。
A
各端末で、アプリケーションを起動したときに、その共有フォルダ内の全テキストファイルをを自動でを読み込むようにし、端末間でそれぞれの端末で入力された全ユーザの日記を共有できるようにする。
以上の処理を作成していますが、Aで自動で読み込むようにしたときに、テキストファイルが使用中であると、エラーとなってしまいます。
「全ファイルを読み込むが、使用中のファイルについてはエラーとせずに回避する。(catchでエラーを取得するのではなく読み込み前に確認する)」
という仕組みを組み込みたいのですが、そのファイルが使用中であるかを事前に取得する方法が分かりません。
何か方法はないでしょうか。
よろしくお願いします。
262デフォルトの名無しさん:2011/02/27(日) 09:20:35.88
他人の日記を編集できないのであれば他人の日記はリードオンリーで開いたらダメなの?
263デフォルトの名無しさん:2011/02/27(日) 09:26:56.61
264こごろう:2011/02/27(日) 09:43:34.72
>>262
ありがとうございます。
パソコンは個人別に割り当てられておらず、ユーザコードを付与して、各人がどの端末からでも自分の日記を登録、更新できる必要があるんです。

>>263
ありがとうございます。
内容を見ましたが、WindowsAPIの機能を利用するのでしょうか。
初心者なのでコードの難易度がとても高そうで、理解できるか自信がありませんが、じっくり読みます。
ただ、お答えいただいていて失礼なのですが、初心者でも組めるもっと簡単に取得する方法はないでしょうか…。
265デフォルトの名無しさん:2011/02/27(日) 09:51:35.09
>>264
>パソコンは個人別に割り当てられておらず、ユーザコードを付与して、
>各人がどの端末からでも自分の日記を登録、更新できる必要があるんです。
別にパソコンを限定してないよ
サーバーと見立てたあるPCの共有フォルダを好き勝手にいろんな端末から
読み書きするってことでしょ?

だからIDで識別してようがそういう仕様はどうでもいいんだけど
とにかくアクセスする際に自分の日記と他人の日記ではアクセス権限が違うんだから
それを利用して読み書きすればいいだけじゃないの?ってこと

その辺が面倒なら共有フォルダを好き勝手アクセスさせるんじゃなくて
サーバー側に言語は何でもいいのでアクセス用のプログラムを立てて
それ経由でやらせればいいだけだしなあ・・
266デフォルトの名無しさん:2011/02/27(日) 09:54:39.02
例外潰していいじゃん
それの何が駄目なんだ?
267デフォルトの名無しさん:2011/02/27(日) 10:00:41.56
>>266
最終的な仕様がわからんからなんともいえないが
編集中はずーとオープンしっぱなしで例外拾ってリトライさせる仕様だと
ずーとリトライだったりしてなw
268デフォルトの名無しさん:2011/02/27(日) 10:02:59.55
仕様はskipするってあるじゃん
なら潰してよくね?
269デフォルトの名無しさん:2011/02/27(日) 10:05:10.29
編集中だからって日記がすでに保存されてるデータが開けないとか糞仕様だろ
編集が終わった段階で書き込んじゃえば多少のリトライで問題ないだろ

というか共有フォルダを好き勝手に複数端末から触れるような糞アプリの仕様もどうかと思うけどなw
270こごろう:2011/02/27(日) 10:09:15.37
>>265
ありがとうございます。
テキストファイルが使用中のときは、「…アクセスが拒否されました。」という例外が起きてしまいます。
これは、Windowsそのものの特性か、共有フォルダの共有設定の仕方の問題なのかもしれませんが、
そのテキストファイルは、共有フォルダがある端末以外のどの端末もシャットダウンしていても、
掴まれて使用されていることになってしまい、直接テキストファイルを削除することもできないんです。
(共有端末を再起動すればそれは解除されます)
なぜ、アプリケーションをどれも起動していないのに、使用中になってしまうのかの原因は分かっていません。

サーバー側にSQLSERVERやAccessを入れようかと思いましたが、
今はそれができない事情にあり、テキストファイルで情報共有する選択肢を取っています。

>>266
例外をスルーしようとしたのですが、
テキスト自動読み取り処理の記述の前後に、catch(exeption)を入れておいた方がいいと言われたループ処理を記述しており、
完全にcatch文をスルーするようにすることができないんです。
(try-catch文の入れる位置やロジックの配置の仕方が悪いかもしれませんが…)

ファイルの読み取りの例外だけスルーしようとして、
catch(IOexeption)を入れてみましたが、結局他の箇所のcatch文(exeption)で引っかかってしまいます。
271デフォルトの名無しさん:2011/02/27(日) 10:10:30.61
DB鯖立てたら簡単な話なんだよな。中古で拾ってくればLinux+MySqlやPostgreSQLで1万程度で何とかなるのに
272デフォルトの名無しさん:2011/02/27(日) 10:18:04.10
ソース晒せ
273デフォルトの名無しさん:2011/02/27(日) 10:18:26.47
>>271
そんなことしなくてもLAN内で共有フォルダを提供してるマシンが
XP以降のwindowsマシンであれば.netで作った簡易webサーバーで済む話

http://www.atmarkit.co.jp/fdotnet/dotnettips/695httplistener/httplistener.html
http://support.microsoft.com/kb/308359/ja

ファイルのアクセス管理はこいつが担当するので各端末からはhttpでアクセスすればいいだけ
274デフォルトの名無しさん:2011/02/27(日) 10:23:28.27
たまにはライセンスの事も思い出して下さい(´・ω・`)
275こごろう:2011/02/27(日) 10:27:36.16
アクセスが拒否されるケースは2パターンあります。
@使用中のファイルを読み取ろうとするとき
A日記は全日程分を1テキストファイルに収めて保存するようにしており、毎回古いテキストファイルを削除して新しいテキストファイルを保存しにいくように
しているのですが、そのファイル削除時に使用中であるとき
のときです。

そのうちのAが下記のようなソースです。

foreach (string sd in System.IO.Directory.GetFiles(ps_path, "*.DIARY", SearchOption.TopDirectoryOnly))
{
string fn = Path.GetFileName(sd);
System.IO.FileInfo fi = new System.IO.FileInfo(sd);
try
{
System.IO.File.Delete(sd);
}
catch (IOException ioex)
{
// ファイルが使用中
}
}
例外をスルーするようにしたのですが、この処理が記述されているサブルーチン(いまどきこんな呼び方はしないのでしょうか)を呼んでいる上位の処理のcatch文で結局エラーとなります。
276デフォルトの名無しさん:2011/02/27(日) 10:30:25.73
>>274
なにか問題になることあったっけ?

簡易サーバーならこっちがいいかも
http://d.hatena.ne.jp/wwwcfe/20080220/1203489899
277デフォルトの名無しさん:2011/02/27(日) 10:31:26.95
スタック遡るって事は握りつぶしてないって事じゃん…
278デフォルトの名無しさん:2011/02/27(日) 10:33:46.23
>日記は全日程分を1テキストファイルに収めて保存するようにしており、毎回古いテキストファイルを削除して新しいテキストファイルを保存しにいくように
>しているのですが、そのファイル削除時に使用中であるとき
>のときです。

よくわからん
人ごとにフォルダ作ってその下にその人の日付単位でtxtファイルを分離しちゃだめなの?
管理のしかたは自由だが少ないtxtファイルに多くの情報を入れようとすればそれだけ
アクセス時のロック時間は長くなるだろうし、無駄にファイルをつかみやすくなるよね
279こごろう:2011/02/27(日) 10:37:46.47
>>277
「スタックを遡る」とはどういう意味でしょうか。教えていただけないでしょうか。
すみません、無知で…(-_-;)。
280デフォルトの名無しさん:2011/02/27(日) 10:40:44.49
スタックとレースでググれ
281デフォルトの名無しさん:2011/02/27(日) 10:42:15.30
知りたいのは例外の握りつぶし方でしょ?
282デフォルトの名無しさん:2011/02/27(日) 10:43:52.25
まずキャッチできてないんだからそれ以前ダス
283デフォルトの名無しさん:2011/02/27(日) 10:45:42.69
キャッチできてないのかもな
284デフォルトの名無しさん:2011/02/27(日) 10:47:13.47
キャッチできてないんだろうね
285こごろう:2011/02/27(日) 10:55:11.80
す・・・すみません。稚拙な質問を重ねてしまって。
一応、catch文に引っかかります。
catch(IOexeption)ではスルーするのですが、
上位の
CATCH(exeption)で引っかかります。