【问题标题】:How can I load an Image from a file without keeping the file locked?如何在不锁定文件的情况下从文件加载图像?
【发布时间】:2011-05-11 08:56:14
【问题描述】:

我希望在 PictureBox 中显示图像,从文件加载图像。该文件会定期被覆盖,所以我不能保持文件锁定。我是这样开始的:

pictureBox.Image = Image.FromFile( fileName );

但是,这会使文件保持锁定状态。然后我尝试通读一个流:

using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
    pictureBox.Image = Image.FromStream(fs);
} 

这不会锁定文件,但确实会导致稍后抛出异常; MSDN 指出流必须在图像的生命周期内保持打开状态。 (例外情况包括“可能无法读取已关闭的文件”或类似消息。)

如何从文件加载图像,然后不再引用该文件?

【问题讨论】:

    标签: .net winforms graphics


    【解决方案1】:

    很抱歉回答我自己的问题,但我认为这对我来说太有用了。

    诀窍是先将文件流中的数据复制到内存流中,然后再将其加载到图像中。那么文件流就可以安全关闭了。

    using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
    {
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        fs.CopyTo(ms);
        ms.Seek(0, System.IO.SeekOrigin.Begin);
        pictureBox.Image = Image.FromStream(ms);
    } 
    

    【讨论】:

      【解决方案2】:

      对于那些在 Framework 4.0 下工作的人,这是我所做的:

      Using fs As New System.IO.FileStream(cImage, IO.FileMode.Open, IO.FileAccess.Read)
                  Dim buffer(fs.Length) As Byte
                  fs.Read(buffer, 0, fs.Length - 1)
                  Using ms As New System.IO.MemoryStream
                      ms.Write(buffer, 0, buffer.Length - 1)
                      picID.Image = Image.FromStream(ms)
                  End Using
              End Using
      

      【讨论】:

        猜你喜欢
        • 2016-03-25
        • 2015-04-13
        • 2011-03-27
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多