0

以下に、タイマーを介して 20 分ごとに呼び出される次のロジックを示します。オブジェクトのコンテンツをファイル パスにシリアル化します。表示される filePath は \hard disk\logs\applicationstate.xml です。有効なパス..

ほとんどの場合は機能しますが、時々、次のスタック スタック トレースが表示されますSystem.IO.IOeExceptionthis.StreamWriter = new StreamWriter(filePath);

System.IO.__Error.WinIOError (Int32 errorCode、文字列 str)\r\n で System.IO.FileStream..ctor (文字列パス、FileMode モード、FileAccess アクセス、FileShare 共有、Int32 bufferSize、ブール値 useAsync、文字列 msgPath) \r\n System.IO.FileStream..ctor (文字列パス、FileMode モード、FileAccess アクセス、FileShare 共有、Int32 bufferSize) で\r\n System.IO.StreamWriter.CreateFile (文字列パス、ブール値の追加) で\r \n
System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) で\r\n System.IO.StreamWriter..ctor(String path) で\r\n Shs.ScanPanel で。 CA.DataManager.DataManagercr.CopyData(オブジェクト データ)\r\n
at System.Threading.Timer.ring()\r\n"

それが発生すると、\hard disk\logs\applicationstate.xml が存在することがわかりますが、0 バイトです。

私の質問は、StreamWriter によってこの 0 バイトのファイルが最初に生成される可能性があるかどうかです。MSDN の StreamWriter で IOException を調べたところ、次のように書かれています

IOException
path には、ファイル名、ディレクトリ名、またはボリューム ラベルの構文の不適切または無効な構文が含まれています。

これは私を混乱させました。これは、0 バイトのファイルに対してストリーム ライターを開こうとするためですか? null オブジェクトがファイルにシリアル化されていた場所で、このコードが最後に実行されたときに、この 0 バイトが生成された可能性はありますか? もしそうなら、Visual Studio でその例外が表示されなかったのはなぜですか?

            if (filePath != string.Empty)
            {
                if (this.StateObject == null)
                {
                    this.StateObject = new State();
                }
                    //Do something to my StateObject object

                    this.StreamWriter = new StreamWriter(filePath);
                    this.Serializer = new XmlSerializer(typeof(State));

                    this.Serializer.Serialize(this.StreamWriter, this.StateObject);
                }
                else
                {
                    if (this.log != null)
                    {
                        this.log.Write(LogLevel.Error, this.componentName, "CopyData : Unable to initilize State Object");
                    }
                }
            }
            else
            {
                if (this.log != null)
                {
                    this.log.Write(LogLevel.Error, this.componentName, "CopyData : Error while retrieving Current working directory");
                }
            }
        }
        catch (Exception ex)
        {
            if (this.log != null)
            {
                this.log.Write(ex, this.componentName);
            }
        }
        finally
        {
            if (this.StreamWriter != null)
            {
                this.StreamWriter.Close();
            }
        }
4

2 に答える 2

0

this.StreamWriter.Flush()を使用して、すべてのコンテンツが書き込まれていることを確認することをお勧めします。

ただし、例外はパスが正しくないと不平を言っているようです。

編集:Opps WinCEタグを見逃しました

于 2012-08-13T15:56:09.670 に答える
0

そこでちょっとしたプログラムを書いてみたところ、ファイルを 0 バイトにする行が this.StreamWriter = new StreamWriter(filePath); にあることが確認できました。

しかし、本当に頭がおかしくなるのは、ファイルを正常に消去して新しいデータをシリアル化できるようにすると同時に、例外をスローすることです。これはStreamWriter apiの下位層であるか、フラッシュドライブで何かできると考えています....結局、このプログラムをWINDOW CEで実行しています

于 2012-08-13T16:35:49.423 に答える