File.Copy \“该进程无法访问该文件 因为它被另一个过程(File.Copy \"Th

2019-10-20 18:30发布

我的代码是这样的:

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();
        }
    }
}

我想要做的是,我提示用户在打开文件对话框选择图像,并且图像复制到不同的目录(TARGETPATH,特别是)。 一切似乎除了那一条线做工精细: System.IO.File.Copy(sourceFile, destFile, true);

它说,该文件是专门用于被另一个进程使用。 这种情况发生,因为我选择的任何图像。

我想看看别人的溶液(S)对这个问题---我有权终止(或等待)为目前正使用我的文件的过程。 如果是这样,我怎么做呢? 或者,如果这不是这个问题的答案,我该怎么办? 请注意,这是在我的C#解决方案与图像文件涉及代码的唯一的一块。

Answer 1:

我觉得你的问题涉及未正确处理位图对象。 如果您创建一个位图,使得它从文件中读取,你不处理它的文件保持打开和锁定。

这里有几个环节:

在C#中打开文件对话框的处置?

C#:Dispose()方法调用Bitmap.save后Bitmap对象()?

正如我在这个答案表明https://stackoverflow.com/a/18172367/253938我使用位图和磁盘上的文件的经验是,最好还是从来没有让位图打开该文件。 取而代之的是,文件读入到一个字节数组,并使用ImageConverter将其转换成图像。



Answer 2:

您需要关闭该文件您已处理完毕后。 使用.Close()属性来关闭文件。

一旦你打开一个文件读它/使用它,它会打开一个后台进程。 为了让这个过程结束,你还需要编程使用关闭.Close()

所以,你的代码需要有一个yourFile.Close()在你的代码的底部。



文章来源: File.Copy \"The process cannot access the file because it is being used by another process
标签: c# io