IOException文件复制未处理。从图片框上传图片时

时间:2011-02-18 02:24:37

标签: c# winforms image ioexception

帮助!我无法弄清楚如何关闭文件。它总是给我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'因为它正被另一个进程使用。

2 个答案:

答案 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帮助程序进程会阻止文件。