トップ回答者
何故か、ファイルの書き込み時に例外処理が走る

質問
-
最初は、open/write/close を一つの関数にまとめていましたが、時より書き込み異常を起こしていました。
そこで、ファイルの書き込みを100ms毎に書き足すこともあり、open/write/close を分けてみました。
すると、粗100%の確率で、writeする部位「Writer.Write(q)」にて異常処理が発生します。→ 「パブリックでないメンバー」と出ています。
どの様に対処したらいいのか、教えて頂けないでしょうか。
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Divider { class CSV { public static StreamWriter Writer; /// <summary> /// CSVファイルを、Open /// </summary> /// <returns></returns> public static int OpenCsvFile() { String file = @"FunctionData.csv"; // 保存先ファイル名 // ファイルが存在しているかどうか確認する // 新規作成時: System.IO.FileMode.Create // 末尾追加時: System.IO.FileMode.Append //FileMode FMode = (File.Exists(file)) ? // FileMode.Append : // ファイルは存在します // FileMode.Create ; // ファイルは存在しません try { Encoding EncoObj = Encoding.GetEncoding(@"shift_jis"); Writer = new StreamWriter(file, true, EncoObj); } catch (Exception ex) { throw; } return 0; // 成功 } // 一文字の情報をCSVファイルに保存する関数 // [引数] // 第1引数: DataGridView[in] // [戻り値] // エラー情報 0: 成功 / 0以外: 失敗 // 失敗時詳細 public static int SaveCsvFile(string q) { try { // 1行分ファイル書き込み Writer.Write(q); // <<<------- ここでエラーとなる } catch (Exception ex) { throw; } return 0; // 成功 } /// <summary> /// CSVファイルを、Close /// </summary> /// <returns></returns> public static int CloseCsvFile() { try { Writer.Close(); // クローズ Writer = null; // ストリーム初期化 } catch (Exception ex) { throw; } return 0; // 成功 } } }
以上、よろしくお願いします。
回答
-
>open した後、writeしようとするとWriteの値がNULLに変化している。
Write MethodがNULLとのことですが、その時Writer変数はどうなっているのでしょうか。
現在の情報から原因が思いつかないのですが、このclassの利用のされ方がこの現象を誘発している可能性はありませんか?
Writer Objectの状態遷移を明らかにしてみては如何でしょうか。
(すでにpurgeされているのかな。)Multi threadで利用している、ということはないですよね。
あと、public static StreamWriter Writer;がclassの外部からaccessできますが、
直接accessしている処理があれば、見直してみてください。こちらで再現できればよいのですが、実際に提示されているCodeを実行しても現象が発生しませんでした。
何れにせよ、調べて情報を出してみてください。
- 回答としてマーク taokato 2011年6月23日 23:21
すべての返信
-
確認です。
・例外の内容をもっと詳しく記述してください。
・再現性が確実とのことですが、SaveCsvFile(string q)のqの中身(文字列)はどうなっていますか?
・UTF-16からShift JISに変換されていますが、Shift-JISに変換できる文字列のみで構成されていますか?
・>最初は、open/write/close を一つの関数にまとめていましたが、時より書き込み異常を起こしていました。
どのようなerrorでしたか?
・このclassを利用する側に問題がないか確認済みですか?
(結果的に書き込みでerrorになっている可能性を気にしています。)
・EncodingをUTF-8やUTF-16に変更すると、状況は変わりますか? -
・例外の内容をもっと詳しく記述してください。
言葉足らずで、済みません。
・再現性が確実とのことですが、SaveCsvFile(string q)のqの中身(文字列)はどうなっていますか?
・UTF-16からShift JISに変換されていますが、Shift-JISに変換できる文字列のみで構成されていますか?q = "1234" の数字表現の文字列です。
・>最初は、open/write/close を一つの関数にまとめていましたが、時より書き込み異常を起こしていました。
どのようなerrorでしたか?一つの関数にまとめていたときも同じでしたが、「パブリックでないメンバー」と出ています。
関数を分けてからわかったことは、open した後、writeしようとするとWriteの値がNULLに変化している。
・EncodingをUTF-8やUTF-16に変更すると、状況は変わりますか?
変わらないようです。
-
>open した後、writeしようとするとWriteの値がNULLに変化している。
Write MethodがNULLとのことですが、その時Writer変数はどうなっているのでしょうか。
現在の情報から原因が思いつかないのですが、このclassの利用のされ方がこの現象を誘発している可能性はありませんか?
Writer Objectの状態遷移を明らかにしてみては如何でしょうか。
(すでにpurgeされているのかな。)Multi threadで利用している、ということはないですよね。
あと、public static StreamWriter Writer;がclassの外部からaccessできますが、
直接accessしている処理があれば、見直してみてください。こちらで再現できればよいのですが、実際に提示されているCodeを実行しても現象が発生しませんでした。
何れにせよ、調べて情報を出してみてください。
- 回答としてマーク taokato 2011年6月23日 23:21