当逐个删除文件时会生成错误,因为“进程无法访问文件”,因为在尝试删除文件时,其他进程正在使用该文件“
代码:有关删除文件的任何建议吗?
private void DeleteFilesFromDestination()
{
string consolidatedFolder = System.Configuration.ConfigurationManager.AppSettings["path"].ToString();
foreach (String file in ListBoxDeleteFiles.Items)
{
try
{
// delete each selected files from the specified TargetFolder
if (System.IO.File.Exists(consolidatedFolder + @"\" + System.IO.Path.GetFileName(file)))
{
proc.WaitForExit();
System.IO.File.Delete(consolidatedFolder + @"\" + System.IO.Path.GetFileName(file));
}
}
catch (Exception ex)
{
MessageBox.Show("Error Could not Delete file from disk " + ex.Message, "Shipment Instruction",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
注意:图像将像这样
加载到一个flowlayout pannel //Open the files to see
private void ListBoxSourceFiles_Click(object sender, EventArgs e)
{
try
{
if (ListBoxSourceFiles.SelectedItem != null || !ListBoxSourceFiles.SelectedItem.Equals(string.Empty))
{
//MessageBox.Show("Selected " + ListBoxSourceFiles.SelectedItem);
PictureBox pb = new PictureBox();
Image loadedImage = null;
loadedImage = Image.FromFile(ListBoxSourceFiles.SelectedItem.ToString());
pb.Height = loadedImage.Height;
pb.Width = loadedImage.Width;
pb.Image = loadedImage;
flowLayoutPanel1.Controls.Clear();
flowLayoutPanel1.Controls.Add(pb);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ship Instruction",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
答案 0 :(得分:6)
您没有具体说明您要删除的文件,但从您的问题来看,这听起来就像您正在尝试删除您加载的图像文件。如果是这种情况,那么你就有问题了。 documentation for Image.FromFile说:
文件保持锁定状态,直到图像被丢弃。
如果您需要能够删除该文件,则需要在加载后复制该图像,并在PictureBox
中使用该图像。然后您可以处理加载的图像,从而解锁文件。
答案 1 :(得分:2)
当被其他进程锁定时,您将无法删除任何文件。
首先必须找出锁定文件的进程 使用SysInternals ProcessExplorer可以实现这一点。使用“查找句柄或DLL”功能。
答案 2 :(得分:0)
如果文件正在使用中,则无法将其删除。但是,如果由于某种原因确实要删除它并且您无法停止锁定文件的进程(例如卸载应用程序时),则可以在下次重新启动操作系统时安排删除文件。在任何进程能够锁定文件之前执行这些计划的删除。
您必须使用空新文件名和标记MOVEFILE_DELAY_UNTIL_REBOOT
来使用MoveFileEx
Windows API。在Stack Overflow问题“MoveFile” function in C# (Delete file after reboot) C#的答案中解释了如何从C#中做到这一点。
答案 3 :(得分:0)
pb.Image.Dispose();
pb.Dispose();
完成上述步骤后,您可以再次使用图片