【问题标题】:File.Copy "The process cannot access the file <filename> because it is being used by another processFile.Copy "进程无法访问文件 <filename> 因为它正被另一个进程使用
【发布时间】:2014-08-24 14:15:50
【问题描述】:

我的代码是这样的:

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# 解决方案中唯一处理图像文件的代码。

【问题讨论】:

  • 您知道哪个进程正在使用您的文件吗?你能控制它吗?
  • 老实说 --- 不,我没有。我相信,该文件仅在此方法中使用,没有在其他地方使用。
  • 使用Process Explorer 等工具查看谁拥有您文件的打开句柄
  • 我使用的IDE是VS 2013,.vhost.exe正在使用该文件。

标签: c# io


【解决方案1】:

我认为您的问题涉及未正确处理 Bitmap 对象。如果您创建一个位图以使其从文件中读取并且您不处置它,则该文件将保持打开和锁定状态。

这里有几个链接:

The dispose of an OpenFileDialog in C#?

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

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

【讨论】:

    【解决方案2】:

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

    一旦你打开一个文件来读取它/使用它,它就会打开一个后台进程。为了结束该过程,您还需要使用 .Close() 以编程方式关闭它

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

    【讨论】:

    • 它会打开一个后台进程,因为文件什么时候启动一个进程?你的意思是打开一个文件句柄
    • 抱歉,“后台进程”可能不是正确的术语。但是在你运行你的程序之后,看看你的任务列表。尽管您看不到文件已打开,但您可以看到它实际上仍处于打开状态并出现在您的任务列表中。为了在程序完成后结束任务,您需要关闭它。
    • 可以这样想:例如,当您打开一个 word 文档时,您通过开始菜单或图标启动程序。完成该文档后,您可以通过执行 File > Close 或按 X 来关闭程序。这里的概念与您以编程方式启动文档但从未关闭它的概念相同。因此,当您再次运行程序或尝试执行您打开的文档时,您会收到一条错误消息,指出它正在被另一个进程使用(因为它从未关闭过)。
    • 当我在内存中打开一个文件并写入它时会发生什么,例如文本文件。然后打开哪个进程?无,仅向操作系统注册了一个文件句柄。
    • “当我打开一个 fi 时会发生什么”你的意思是文件吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2015-12-07
    • 2011-04-17
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多