none
读取本地文件,出现timeout错误,求高手。

    问题

  • 能写,同样的文件能写入,但是就是读不出来。发生错误的代码:

    FileStream fs = File.OpenRead("Booklists.dat");

    这个文件是这个程序写出来的文件,但是当读取的时候出错:

    内容为null,

    + ReadTimeout “System.IO.Stream.Null.ReadTimeout”引发了类型“System.InvalidOperationException”的异常 int {System.InvalidOperationException}

      Message "此流上不支持超时。" string

    +  WriteTimeout “System.IO.Stream.Null.WriteTimeout”引发了类型“System.InvalidOperationException”的异常 int {System.InvalidOperationException}

    readtimeout

    write out

    2016年11月2日 15:23

答案

  • FileAccess.Read, FileShare.Read 的解释和具体原因参考这里

    http://www.cnblogs.com/jhxk/articles/2628235.html

    理解为首先打开一个文件之后(资源未释放),我们可以再用只读的方式读取文件从而不会抛出文件无法访问的异常


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 fanyule 2016年11月28日 12:47
    2016年11月3日 13:14

全部回复

  • 可能是写文件后,没有释放流,再读取的时候,一直在等待写入完成。

    StreamWriter writer=...

    writer.Flush();

    writer.Close();

    //写入完成后,再读取

    FileStream fs = File.OpenRead("Booklists.dat");


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年11月3日 2:01
  • Hi,

    你方便给出写文件的代码吗?如Shuanghua Li 说的,你可能没有正常关闭文件,导致文件不完全,是空文件.

    这个timeout是个文件的属性,应该是在文件被完全写进去以后,才会给timeout赋值。因为文件没有正常关闭,所以timeout一直没有。

    关于timeout 的解释,可以看一下MSDN文档

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月3日 9:06
    版主
  • 非常感谢,虽然不知道具体怎么回事,但是我的文件肯定已经关闭了,我用的using写的文件。另外debug的时候只执行打开文件也发生这种情况。最终我还是解决了用了这个方法:

     
    using (BinaryReader br = new BinaryReader(File.Open("Booklists.dat",FileMode.Open,FileAccess.Read,FileShare.Read)))

    不知道什么原理,好像直接用File.OpenRead就出现错误。

    如果您知道什么原因请告诉我,多谢。

    2016年11月3日 11:46
  • 用的using操作文件,应该不存在不正常关闭文件问题。
    MSDN上说:ReadTimeout 方法总是引发 InvalidOperationException。应该是个错误(我不知道这样理解对不对)。而且调试信息里说:“此流上不支持超时。”

    将代码改成这样就成功了:

    using (BinaryReader br = new BinaryReader(File.Open("Booklists.dat",FileMode.Open,FileAccess.Read,FileShare.Read)))

    不知道什么原理,好像直接用File.OpenRead就出现错误。如果您知道什么原因请告诉我,多谢。

    2016年11月3日 11:53
  • FileAccess.Read, FileShare.Read 的解释和具体原因参考这里

    http://www.cnblogs.com/jhxk/articles/2628235.html

    理解为首先打开一个文件之后(资源未释放),我们可以再用只读的方式读取文件从而不会抛出文件无法访问的异常


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 fanyule 2016年11月28日 12:47
    2016年11月3日 13:14