创建文件后删除文件

时间:2016-02-18 18:18:25

标签: c# file

所以我正在创建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);
}

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

1 个答案:

答案 0 :(得分:0)

请参阅CompilerResults.CompiledAssembly Property

上的说明
  

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

所以当你这样做时:

Assembly assembly = results.CompiledAssembly;

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