我有一个将图像保存到数据库的按钮,一个删除目录的功能是我在保存到数据库之前临时存储图像。
这是代码
private void btnSave_Click(object sender, EventArgs e)
{
imgTemp = new System.Windows.Forms.PictureBox();
imgTemp.Image = Image.FromFile(@cwd + "\\Final.jpg");
MemoryStream mstr = new MemoryStream();
imgTemp.Image.Save(mstr, imgTemp.Image.RawFormat);
byte[] arrImage = mstr.GetBuffer();
//Set insert query
imgTemp.Image = null;
imgTemp.Dispose();
string qry = "insert into FinalImages (FinalImageName, FinalImage, Parts) values(@FinalImageName, @FinalImage, @Parts)";
SqlConnection c = new SqlConnection(c_string);
//Initialize SqlCommand object for insert.
SqlCommand SqlCom = new SqlCommand(qry, c);
//We are passing Original Image Path and Image byte data as sql parameters.
SqlCom.Parameters.Add(new SqlParameter("@FinalImageName", SqlDbType.Char, 40)).Value = textBox1.Text + ".jpg";
SqlCom.Parameters.Add(new SqlParameter("@FinalImage", SqlDbType.Image)).Value = arrImage;
SqlCom.Parameters.Add(new SqlParameter("@Parts", SqlDbType.VarChar, 40)).Value = NumOfFiles;
try
{
c.Open();
SqlCom.ExecuteNonQuery();
}
catch (System.Data.SqlClient.SqlException err)
{
MessageBox.Show(err.Message);
}
finally
{
c.Close();
}
// How many Picture files in this folder
imgArray2 = new System.Windows.Forms.PictureBox[NumOfFiles];
for (int i = 0; i < NumOfFiles; i++)
{
Bitmap(imgName[i]);
imgArray2[i] = new System.Windows.Forms.PictureBox();
imgArray2[i].Image = Image.FromFile(imgName[i]);
string name2 = textBox1.Text + ".jpg";
string name3 = imgName[i].Substring(imgName[i].LastIndexOf(@"\") + 1, imgName[i].Length - imgName[i].LastIndexOf(@"\") - 1);
MemoryStream mstr2 = new MemoryStream();
imgArray2[i].Image.Save(mstr2, imgArray2[i].Image.RawFormat);
byte[] arrImage2 = mstr2.GetBuffer();
string cmd2 = "insert into ImageParts (FinalImageName, ImagePartName, ImagePart) values (@FIName2, @IPName, @IP)";
SqlConnection c2 = new SqlConnection(c_string);
SqlCommand comm2 = new SqlCommand(cmd2, c2);
comm2.Parameters.Add(new SqlParameter("@FIName2", SqlDbType.Char, 40)).Value = name2;
comm2.Parameters.Add(new SqlParameter("@IPName", SqlDbType.Char, 40)).Value = name3;
comm2.Parameters.Add(new SqlParameter("@IP", SqlDbType.Image)).Value = arrImage2;
try
{
c2.Open();
comm2.ExecuteNonQuery();
}
catch (System.Data.SqlClient.SqlException err)
{
MessageBox.Show(err.Message);
}
finally
{
c2.Close();
}
}
DelDir();
this.Hide();
fourthForm.Show();
}
private void DelDir()
{
string[] files = Directory.GetFiles(cwd);
string[] dirs = Directory.GetDirectories(cwd);
foreach (string file in files)
{
File.SetAttributes(cwd, FileAttributes.Normal);
File.Delete(file);
}
Directory.Delete(cwd, false);
}
这是完整的例外
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
System.IO.IOException: The process cannot access the file 'C:\...\Final.jpg' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.Delete(String path)
at BlueStitch.frmStitch.DelDir() in C:\...\frmStitch.cs:line 953
at BlueStitch.frmStitch.button1_Click(Object sender, EventArgs e) in C:\...\frmStitch.cs:line 940
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at BlueStitch.Program.Main() in C:\Users\Freddie Rosillo\Documents\Visual Studio 2008\Projects\BlueStitch\BlueStitch\BlueStitch\Program.cs:line 21
行是File.Delete(file);
我想我试图处理图像文件,但仍然无法工作
请帮忙
答案 0 :(得分:2)
看看这两行:
imgTemp.Image = null;
imgTemp.Dispose();
在您处置PictureBox
之前,您正在释放对图像的引用。这意味着PictureBox
在调用Dispose()方法时无法处理图像。在垃圾收集器调用图像的终结器之前,图像不会被处理。
答案 1 :(得分:0)
我对此并不乐观,但我注意到你在第一部分处理你的形象非常小心:
imgTemp.Image = null;
imgTemp.Dispose();
但你在第二部分忽略了这一点:
imgArray2[i].Image = Image.FromFile(imgName[i]);
string name2 = textBox1.Text + ".jpg";
string name3 = imgName[i].Substring(imgName[i].LastIndexOf(@"\") + 1, imgName[i].Length - imgName[i].LastIndexOf(@"\") - 1);
MemoryStream mstr2 = new MemoryStream();
imgArray2[i].Image.Save(mstr2, imgArray2[i].Image.RawFormat);
byte[] arrImage2 = mstr2.GetBuffer();
尝试将这些添加到最后一部分的行中:
//Set insert query
imgArray2[i].Image = null;
imgArray2[i].Dispose();