从文件打开图像,然后释放锁定?

Eag*_*Eye 67 c# locking image winforms

我正在使用以下代码行Image从文件中打开:

pictureBox1.Image = Image.FromFile("test.png");
Run Code Online (Sandbox Code Playgroud)

我希望它能锁定文件,将图像加载到内存中,设置pictureBox1.Image为内存中的副本,然后释放锁定.在现实中,锁不会消失,直到我Dispose()Image记忆.我无法释放我不再使用的硬盘上的文件锁,直到我删除了我正在使用的内存中的文件. 微软的网站在一篇带有C#标签的文章中提及它,但他们的解决方案是用visual basic编写的,这对我来说毫无用处.

总结:我想设置pictureBox1.Image存储的图像"test.png",然后让用户编辑或删除"test.png"或其他.

net*_*rog 82

流的方法不正确.

请参见/sf/answers/609122391/

从上面的链接中纠正代码:

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp);
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,你的应该是接受的答案.将代码粘贴到您的答案中 (2认同)
  • 有关正在发生的事情的详细讨论,请参阅[此答案](http://stackoverflow.com/a/13935966/3367144)。值得注意的是,“.Clone()”方法将使文件保持锁定状态,即使原始文件是“.Dispose()”之后也是如此。正如这个答案所示,复制构建的克隆是实现这一目标的方法。 (2认同)

Jos*_*shL 47

或者更好的是,使用一个using声明(以下代码是从sylon的[删除]帖子中复制的).这样,如果Image.FromStream抛出异常,您仍然可以确保流立即关闭.

using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
}
Run Code Online (Sandbox Code Playgroud)

  • 很坏.你永远不会这样做,它会在以后引起问题.阅读本文:http://stackoverflow.com/a/8701748/355264 (6认同)
  • 路人,**不要这样做**.最好在打开它之后复制构造`Image`或`Bitmap`,然后`.Dispose()`用于从文件打开的那个.那会释放文件锁.请注意,即使在原始文件是`.Disposed()`之后,`.Clone()`副本也会使文件保持锁定状态.复制构造的副本将释放文件锁.[见这里.](http://stackoverflow.com/a/13935966/3367144) (2认同)

lah*_*rah 10

您还可以使用流来读取图像,然后关闭流.

FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();
Run Code Online (Sandbox Code Playgroud)