问题描述
使用“打开文件”对话框在应用程序中打开照片后,除非关闭应用程序,否则无法对该文件执行任何操作。我已将OpenFile对话框放在using语句中,并尝试了各种方法来释放资源,但均未成功。如何释放该进程以避免出现错误消息“该进程无法访问文件,因为该文件正在被另一个进程使用?
using (OpenFileDialog GetPhoto = new OpenFileDialog())
{
GetPhoto.Filter = "images | *.jpg";
if (GetPhoto.ShowDialog() == DialogResult.OK)
{
pbPhoto.Image = Image.FromFile(GetPhoto.FileName);
txtPath.Text = GetPhoto.FileName;
txtTitle.Text = System.IO.Path.GetFileNameWithoutExtension(GetPhoto.FileName);
//GetPhoto.dispose(); Tried this
//GetPhoto.Reset(); Tried this
//GC.Collect(): Tried this
}
}
解决方法
如Image.FromFile
的文档所述:
该文件将保持锁定状态,直到处理完图像为止。
因此,您可以尝试制作图像的副本,然后发布原始的Image
:
using (OpenFileDialog GetPhoto = new OpenFileDialog())
{
GetPhoto.Filter = "images | *.jpg";
if (GetPhoto.ShowDialog() == DialogResult.OK)
{
using (var image = Image.FromFile(GetPhoto.FileName))
{
pbPhoto.Image = (Image) image.Clone(); // Make a copy
txtPath.Text = GetPhoto.FileName;
txtTitle.Text = System.IO.Path.GetFileNameWithoutExtension(GetPhoto.FileName);
}
}
}
如果没有帮助,您可以尝试通过MemoryStream
和Image.FromStream
方法进行复制:System.Drawing.Image to stream C#
您的问题不是(OpenFileDialog)您的问题是针对PictureBox
您可以使用this来加载图像,或者如果不起作用
为此加载图片
OpenFileDialog GetPhoto = new OpenFileDialog();
GetPhoto.Filter = "images | *.jpg";
if (GetPhoto.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(path: GetPhoto.FileName,mode: FileMode.Open);
Bitmap bitmap = new Bitmap(fs);
fs.Close(); // End using
fs.Dispose();
pbPhoto.Image = bitmap;
txtPath.Text = GetPhoto.FileName;
txtTitle.Text = System.IO.Path.GetFileNameWithoutExtension(GetPhoto.FileName);
}