在后台工作程序中重命名文件时,文件“正被另一个进程使用”

本文关键字:文件 另一个 进程 工作程序 后台 重命名 | 更新日期: 2023-09-27 18:36:59

大多数

关于此错误的 C# SO 问题都涉及 Streamwriter。我不认为这个问题是相关的。

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

在 MainForm (窗体) 类中 - 生成后台工作线程:

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

Inside ImagePreprocessor class - 后台工作线程运行的方法:

public void PreprocessImages(BackgroundWorker worker)
    {
        this.worker = worker;
        if (!Directory.Exists(SourceImageDirectoryPath))
            return;
        else
        {...}
        if (!AreAllImagesValid())
            return;
        else
        {...}
        print.PrintLine("Renaming files...");
        AutoRenameAllImages();

内部图像预处理器类 - 重命名图像的方法:

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)
            {
                ...
            }
        }
    }

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

在后台工作程序中重命名文件时,文件“正被另一个进程使用”

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

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

我以前见过这种情况。