File.Copy&#34;进程无法访问文件<filename>,因为它正由另一个进程使用</filename>

时间:2014-08-24 03:56:30

标签: c# io

我的代码是这样的:

using (var openFileDialogForImgUser = new OpenFileDialog())
{
    string location = null;
    string fileName = null;
    string sourceFile = null;
    string destFile = null;
    string targetPath = @"..\..\Images";
    openFileDialogForImgUser.Filter = "Image Files (*.jpg, *.png, *.gif, *.bmp)|*.jpg; *.png; *.gif; *.bmp|All Files (*.*)|*.*"; // filtering only picture file types
    openFileDialogForImgUser.InitialDirectory = @"D:\My Pictures";
    var openFileResult = openFileDialogForImgUser.ShowDialog(); // show the file open dialog box
    if (openFileResult == DialogResult.OK)
    {
        using (var formSaveImg = new FormSave())
        {
            var saveResult = formSaveImg.ShowDialog();
            if (saveResult == DialogResult.Yes)
            {
                imgUser.Image = new Bitmap(openFileDialogForImgUser.FileName); //showing the image opened in the picturebox
                fileName = openFileDialogForImgUser.FileName;
                location = Path.GetDirectoryName(fileName);

                sourceFile = System.IO.Path.Combine(location, fileName);
                destFile = System.IO.Path.Combine(targetPath, fileName);

                if (!System.IO.Directory.Exists(targetPath))
                {
                    System.IO.Directory.CreateDirectory(targetPath);
                }

                System.IO.File.Copy(sourceFile, destFile, true); /* error occurs at this line */

            }
            else
                openFileDialogForImgUser.Dispose();
        }
    }
}

我要做的是提示用户在OpenFileDialog中选择一个图像,并将该图片复制到另一个目录(具体为targetPath)。除了那一行之外,一切似乎都能正常工作:System.IO.File.Copy(sourceFile, destFile, true);

它表示该文件仅供另一个进程使用。对于我选择的任何图像都会发生这种情况。

我正在尝试查看其他人对此问题的解决方案 - 我必须终止(或等待)使用我的文件的进程。如果是这样,我该怎么做?或者,如果这不是答案,我该怎么办?请注意,这是在C#解决方案中处理图像文件的唯一代码。

2 个答案:

答案 0 :(得分:1)

我认为你的问题涉及不正确处理Bitmap对象。如果您创建一个Bitmap,使其从文件中读取而您没有丢弃它,则该文件将保持打开状态并被锁定。

以下是几个链接:

The dispose of an OpenFileDialog in C#?

C#: Dispose() a Bitmap object after call Bitmap.save()?

正如我在回答https://stackoverflow.com/a/18172367/253938中指出的那样,我使用Bitmap和磁盘文件的经验是,最好永远不要让Bitmap打开文件。相反,将文件读入字节数组并使用ImageConverter将其转换为图像。

答案 1 :(得分:0)

您需要在完成后关闭文件。使用.Close()属性关闭文件。

打开文件阅读/使用后,它会打开后台进程。要使该过程结束,您还需要使用.Close()

以编程方式关闭它

因此,您的代码需要在代码的底部有一个yourFile.Close()