none
何故か、ファイルの書き込み時に例外処理が走る RRS feed

  • 質問

  • 最初は、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; // 成功
    
        }
      }
    }
    
    

     

    以上、よろしくお願いします。

     

    2011年6月23日 11:29

回答

  • 例外の原因についてはよくわかりませんが、
    ファイルへの追記を実現したいのであれば、File.AppendAllText メソッドを使ってみてはどうでしょうか?
    open/close はこのメソッドの内部で勝手にやってくれます。
    http://msdn.microsoft.com/ja-jp/library/ms143357.aspx

    • 回答としてマーク taokato 2011年6月23日 23:21
    2011年6月23日 13:07
  • >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
    2011年6月23日 15:07

すべての返信

  • 確認です。

    ・例外の内容をもっと詳しく記述してください。
    ・再現性が確実とのことですが、SaveCsvFile(string q)のqの中身(文字列)はどうなっていますか?
    ・UTF-16からShift JISに変換されていますが、Shift-JISに変換できる文字列のみで構成されていますか?
    ・>最初は、open/write/close を一つの関数にまとめていましたが、時より書き込み異常を起こしていました。
      どのようなerrorでしたか?
    ・このclassを利用する側に問題がないか確認済みですか?
      (結果的に書き込みでerrorになっている可能性を気にしています。)
    ・EncodingをUTF-8やUTF-16に変更すると、状況は変わりますか?

    2011年6月23日 12:03
  • ・例外の内容をもっと詳しく記述してください。

    言葉足らずで、済みません。

     

    ・再現性が確実とのことですが、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に変更すると、状況は変わりますか?

    変わらないようです。

    2011年6月23日 12:58
  • 例外の原因についてはよくわかりませんが、
    ファイルへの追記を実現したいのであれば、File.AppendAllText メソッドを使ってみてはどうでしょうか?
    open/close はこのメソッドの内部で勝手にやってくれます。
    http://msdn.microsoft.com/ja-jp/library/ms143357.aspx

    • 回答としてマーク taokato 2011年6月23日 23:21
    2011年6月23日 13:07
  • >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
    2011年6月23日 15:07
  • kozzさんへ

    有難うございます。

    ソースコードを読んでいると、デリゲートからwriteしようとしていました。

    何故、そうなるのか(Write MethodがNULL)はよく分かりませんかが、別の場所で確認してみたら正常に動きました。

     

    >public static StreamWriter Writer;がclassの外部からaccessできますが、
    >直接accessしている処理があれば、見直してみてください。

    private でも作っていたましたが、巧くいかなかったのでこのような形になってしまいました。

    2011年6月23日 23:18
  • さかぽん さんへ

    有難うございます。

    File.AppendAllText メソッドを、検討させていただきます。

    2011年6月23日 23:20