我在尝试删除图像文件时遇到问题。 我总是得到一个错误:IOExeption未处理。访问被拒绝,因为该文件正被另一个进程使用。
我不知道可能是什么过程以及如何解决它。
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) { Album album = GetAlbum(comboBox1.SelectedIndex); Photo photo = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex); txtPhotoPath.Text = Directory.GetCurrentDirectory() + "\\" + photo.SPath; lblExtention.Text = photo.SExtention; txtPhotoTitle.Text = photo.STitle; pctrbFoto.Image = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr()); } private void btnChangePhoto_Click(object sender, EventArgs e) { Album album = GetAlbum(comboBox1.SelectedIndex); Photo photo = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex); File.Delete("Albums\\Images\\" + photo.STitle + foto.SExtention); photo.SExtention = lblExtention.Text; photo.STitle = txtPhotoTitel.Text; Photo.SPath = txtPath.Text; File.Copy(photo.SPath, "Albums\\Images\\" + photo.STitle + photo.SExtention); }
谢谢, Vinzcent
感谢所有人的帮助。
我用过这个,现在效果很好
你的进程是使用文件的进程,你需要将image设置为null使用类似这样的东西:
var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath,150)),GetfHeight(photo.SPath,150),null,new IntPtr());
pctrbFoto.Image = img;
img = null;
GC.Collect的();
答案 0 :(得分:6)
我要看的第一个区域是你的GetPhoto方法。你有一个尚未关闭的StreamReader吗?如果您在删除之前对文件执行任何类型的I / O,请确保先关闭这些连接。 GetPhoto()方法有什么作用?
答案 1 :(得分:3)
首先,您需要确定它是您的应用程序还是打开文件的其他应用程序。
您可以使用Mark Russinovich的Process Explorer查看哪个程序打开了特定文件或目录。它是每个程序员/ IT专业人员应该使用(或至少知道)的Windows Sysinternals系列优秀实用程序的一部分。
您可以在此处获取:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
答案 2 :(得分:3)
您将使用缩略图:
using(Image img = Image.FromFile(foto.SPath))
{
pctrbPhoto. Image = img.GetThumbnailImage(
GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)),
GetfHeight(photo.SPath, 150), null, new IntPtr());
}
确保源图像在完成后处理(关闭)。
他们拥有它,从文件加载的图像一直存在,直到垃圾收集器决定释放它,这可能是一段时间。
使用FromFile加载的图像会保存从开放加载的文件。
答案 3 :(得分:2)
当您在Image.FromFile
中呼叫comboBox3_SelectedIndexChanged
时,也可能在其他地方呼叫时,您不会处置Image
对象。因此,您的程序正在使用该文件。
每次打开图像时都需要处理图像。
答案 4 :(得分:2)
您的进程是使用文件的进程,您需要将image设置为null 使用这样的东西:
using(var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr()))
pctrbFoto.Image = img;
答案 5 :(得分:1)
当其他所有方法都失败时,您可以使用MoveFileEx在下次重新启动时删除该文件。
答案 6 :(得分:0)
您可以使用Unlocker程序告诉您哪些程序已锁定文件
注意:删除了Unlocker程序的链接 - 包含恶意软件。
答案 7 :(得分:0)
...但是,如果您的应用程序在网络托管计划上运行?您无法在共享服务器中运行任何软件。
我尝试过dispose()和其他选项,但我无法删除像Vinzcent这样的文件。
Maldito IIS:@
答案 8 :(得分:0)
尝试从同一软件中删除/修改以前保存的文件时,会发生此问题。 我通过添加以下代码解决了该问题:
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
File.Delete(MyFile);
答案 9 :(得分:-1)
我曾经使用过像 thestar 和 Sadegh 这样的内容 但在某些情况下,它没有工作/帮助所以我找到了一个不同的解决方案 我已经发布了here
仍然在这里代码(你可以在看完链接和问题后更好地理解它):
var imageAsByteArray = File.ReadAllBytes(imagePath);
// I use as example a pictureBox:
pictureBox1.Image = byteArrayToImage(imageAsByteArray);
// Or/and safe/copy/replace it:
File.WriteAllBytes(picture_Path, imageAsByteArray);
您也可以立即删除(新)图片! (如果你想)