0

我有以下逻辑,每 20 分钟通过 Timer 调用一次,它将对象的内容序列化为文件路径,我看到的 filePath 是 \hard disk\logs\applicationstate.xml ,请注意我确认这是一个有效的路径..

它在大多数情况下都有效,但我时不时地通过以下堆栈堆栈跟踪得到System.IO.IOeException在线:this.StreamWriter = new StreamWriter(filePath);

在 System.IO.__Error.WinIOError(Int32 errorCode, String str)\r\n at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String 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
路径包含文件名、目录名或卷标语法的错误或无效语法。

这让我很困惑,是不是因为它试图打开一个 0 字节文件的流写入器?这个 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 回答