我使用两个windows forms
,第一个表单将在datagridview
中填充多个图像文件,在第二个表单中所有这些图像都放在另一个datagridview
控件中,第二个{{ 1}}控件有一个按钮datagridview
,它将删除文件。
单击按钮后,在使用文件时发生异常。但我已经处理了Delete Image
并清除了它的行,但它仍然导致不释放图像。我已经尝试过调用datagridview
方法,但它没有帮助。我的示例代码如下。
在第一张表格中
GC.Collect();
以及第二种形式:
// Commenting the code above
if (validuser)
{
dgvImages.Rows.Clear();
dgvImages.Dispose();
GC.Collect();
var form = new NewForm();
form.Show();
this.Hide();
}
编辑:以下是我加载图片的方式
private void dgvImages_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
try
{
if (e.ColumnIndex == 1)
{
string selectedpath = dgvImages.Rows[e.RowIndex].Cells[2].Value.ToString(); // this cell contains the full path of the image
if (File.Exists(selectedpath))
{
dgvImages.Rows.Clear();
dgvImages.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
File.Delete(selectedpath);
LoadImages();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); // File is in use
}
}
答案 0 :(得分:1)
默认情况下,当您使用Image.FromFile时,它将锁定文件,直到图像被丢弃。
根据MSDN资源
https://msdn.microsoft.com/en-us/library/4sahykhd(v=vs.110).aspx
您要做的是按照此答案加载图片。
Open Image from file, then release lock?
Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
img = new Bitmap(bmpTemp, true);
}
根据新的Bitmap文档,您可能需要使用icm。
https://msdn.microsoft.com/en-us/library/3135s427(v=vs.110).aspx
使用此构造函数打开具有以下文件格式的图像:BMP,GIF,EXIF,JPG,PNG和TIFF。
答案 1 :(得分:1)
Image.FromFile()方法通过GDI +
锁定文件使用以下代码从流加载图像:
public Image GetmageFromStream(string path)
{
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) {
var img = Image.FromStream(fs);
return img;
}
}