帮助!我无法弄清楚如何关闭文件。它总是给我IOException文件,类似它正被另一个进程使用
这是我的代码
private void uploadpic_btn_Click(object sender, EventArgs e)
{
open_dialog = new OpenFileDialog();
open_dialog.Title = "Open picture";
open_dialog.Filter = "JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)|*.jpg";
if (open_dialog.ShowDialog() != DialogResult.Cancel)
{
uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName);
uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch;
uploadpic_pb.BorderStyle = BorderStyle.FixedSingle;
}
}
private void saveBTN_Click(object sender, EventArgs e)
{
string targetPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "\\Pictures");
string destFile = Path.Combine(targetPath, "Copied.jpg");
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
File.Copy(open_dialog.FileName, destFile, true);
}
private void Form1_Load(object sender, EventArgs e)
{
Image myimage = Image.FromFile(@"C:\Pictures\Copied.jpg");
uploadpic_pb.BackgroundImage = myimage;
uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch;
uploadpic_pb.BorderStyle = BorderStyle.FixedSingle;
}
异常返回
该进程无法访问该文件&C; \ Pictures \ Copied.jpg'因为它正被另一个进程使用。
答案 0 :(得分:3)
Image.FromFile()对文件进行写锁定。 Form1_Load()因此锁定了Copied.jpg。然后按uploadpic_btn按钮将新位图分配给BackgroundImage属性。然而,按下saveBTN可能会失败,就像编写代码一样。 Copied.jpg 仍然锁定,Image对象仍然存在。它在垃圾收集器运行之前不会消失。
为避免等待,您必须处理图像。修正:
if (open_dialog.ShowDialog() != DialogResult.Cancel)
{
if (uploadpic_pb.BackgroundImage != null) uploadpic_pb.BackgroundImage.Dispose();
uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName);
// etc...
}
答案 1 :(得分:1)
尝试使用类级别变量作为filename而不是targetPath,可能会附加日期时间以使其保持唯一。在File.copy中保持overwrite = false并查看它是否有效。这只是一个测试,看你正在使用Copied.Jpg文件。
另外 - 在发布模式下编译解决方案并尝试直接从bin而不是Visual Studio从EXE运行。有时,Visual Studio帮助程序进程会阻止文件。