创建文件后删除文件

本文关键字:文件 删除 创建 | 更新日期: 2023-09-27 18:35:12

所以我正在创建dll类型文件,运行它们,然后我想删除它们。

但是,当我尝试删除它们时,我得到一个异常,因为它声称它们仍在被另一个进程使用。

我假设用于创建文件的代码没有正确处理资源以允许在之后删除文件,这是我创建文件的代码。

if (!Directory.Exists(PathToRobots + Generation))
{
    Directory.CreateDirectory(PathToRobots + Generation);
}
File.WriteAllText(Path.Combine(PathToRobots + Generation, NameSpace + GetRobotName() + robotNumber + ".cs"), code);

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters()
{
    GenerateInMemory = false,
    GenerateExecutable = false, // True = EXE, False = DLL
    IncludeDebugInformation = true,
    OutputAssembly = Path.Combine(FileName + ".dll") // Compilation name
};
parameters.ReferencedAssemblies.Add(@"robocode.dll");
CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
if (results.Errors.HasErrors)
{
    StringBuilder sb = new StringBuilder();
    foreach (CompilerError error in results.Errors)
    {
        sb.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
    }
    throw new InvalidOperationException(sb.ToString());
}
Assembly assembly = results.CompiledAssembly;
provider.Dispose();

删除文件的代码非常简单,如下所示,

var files = Directory.GetFiles(DirectoryPath);
foreach (var file in files)
{
    File.Delete(file);
}

知道为什么我不能删除文件吗?

创建文件后删除文件

请参阅 CompilerResults.CompiledAssembly Properties 中的注释

属性的 get 访问器调用 Load 方法,以将已编译的程序集加载到当前应用程序域中。调用 get 访问器后,在卸载当前 AppDomain 之前,无法删除已编译的程序集。

因此,当您执行此操作时:

Assembly assembly = results.CompiledAssembly;

您已将已编译的程序集加载到当前应用程序域中,因此已锁定该文件。为了能够删除生成的文件,您需要将其加载到单独的应用程序域中(此答案可能有助于详细说明执行此操作)。