2

帮助!我不知道如何关闭文件。它总是给我 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”,因为它正被另一个进程使用。

4

2 回答 2

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...
    }
于 2011-02-18T03:11:31.863 回答
1

尝试对文件名使用类级别变量而不是 targetPath 可能会附加日期时间以保持其唯一性。在 File.copy 中保留 overwrite = false 并查看它是否有效。这只是一个测试,看看您 Copied.Jpg 文件是否正在使用中。

另外 - 在发布模式下编译解决方案并尝试直接从 bin 而不是 Visual Studio 从 EXE 运行。有时,Visual Studio 帮助程序会阻止文件。

于 2011-02-18T02:53:36.417 回答