【问题标题】:When renaming file in Backgroundworker, file is "being used by another process"在Backgroundworker中重命名文件时,文件“正在被另一个进程使用”
【发布时间】:2016-03-01 12:26:19
【问题描述】:

有关此错误的大多数 C# SO 问题都涉及 Streamwriter。我不相信这个问题是相关的。

我有一个 WinForms 应用程序。该应用程序会生成一个后台工作人员来执行实际工作(图像处理)以保持响应。在一个函数中,我尝试重命名目录中的所有图像文件(不打开它们)。我收到错误“该进程无法访问该文件,因为它正被另一个进程使用。”我无法追踪错误的来源。

在 MainForm (form) 类中 - 生成 backgroundworker:

private void b_preprocessImages_Click(object sender, EventArgs e)
    {
        if (bgw_preprocessor.IsBusy == false)
        {
            bgw_preprocessor.RunWorkerAsync();
        }
        else 
        {...}
    }

仍在 MainForm 类中 - 后台工作人员的 DoWork 方法:

private void bgw_preprocessor_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        ImagePreprocessor preprocessor = new ImagePreprocessor();
        preprocessor.SetImageDirectoryPath(path);
        preprocessor.PreprocessImages(worker);    
    }

ImagePreprocessor 类内部 - 后台工作程序运行的方法:

public void PreprocessImages(BackgroundWorker worker)
    {
        this.worker = worker;

        if (!Directory.Exists(SourceImageDirectoryPath))
            return;
        else
        {...}

        if (!AreAllImagesValid())
            return;
        else
        {...}

        print.PrintLine("Renaming files...");
        AutoRenameAllImages();

ImagePreprocessor 类内部 - 重命名图像的方法:

public void AutoRenameAllImages()
    {
        for (int i = 0; i < sourceImageFiles.Length; i++)
        {
            // sourceImageFiles[] is an array of strings
            FileInfo f = new FileInfo(sourceImageFiles[i]);
            string newName = Path.Combine(SourceImageDirectoryPath, "src_" + i.ToString() + f.Extension);
            print.PrintLine("Renaming " + f.Name + " to " + (new FileInfo(newName)).Name);

            try
            {
                f.MoveTo(newName);
                //File.Move(sourceImageFiles[i], newName);   // doesn't work either
            }
            catch (Exception ex)
            {
                ...
            }
        }
    }

尝试重命名第一个文件时会立即遇到错误。据我所知,有问题的文件都没有在任何其他应用程序中打开。我该如何解决这个问题?

【问题讨论】:

  • 使用句柄命令行工具查看哪些进程持有文件。 technet.microsoft.com/en-us/sysinternals/handle.aspx
  • 这个问题很可能是您在您的应用程序的某个地方使用了此文件,而不是其他应用程序。而你忘记关闭它。
  • 我根本没有打开任何文件的代码——到目前为止,只有获取文件名、计数文件、重命名它们等。@Cobster 我会看看我能用那个句柄工具找到什么.
  • 如何检查AreAllImagesValid的图片是否有效?你只是检查他们的文件扩展名吗?

标签: c# backgroundworker


【解决方案1】:

查看是否可以在 IDE 打开的情况下删除该文件。如果您无法关闭 IDE 并尝试再次删除该文件。如果它有效,则文件将被 IDE 保持打开状态。如果您在代码运行时中断代码或忘记关闭文件,通常会发生这种情况。

我并不是说这会解决问题,但它会排除 IDE 和调试问题。

我以前见过这种情况。

【讨论】:

  • 我可以在 Visual Studio 打开的情况下删除该文件。但是,当我运行程序并打破错误时,我无法手动删除它(文件在 vshost32.exe 中打开)。我没有任何明确的代码来打开任何文件。
  • 这意味着文件是通过 Visual Studio 打开的,无论是通过您的代码还是文件移动之类的调用,并且没有正确关闭。您必须关闭 IDE 才能释放文件。
  • 许多调用会打开文件,即使您不知道它们会打开文件。例如, File.Moveto 以我认为它复制文件并删除旧文件的方式工作,以便打开文件。在搬家之前,我们手动进行了复制和删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多