Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deleting files after creating them

Tags:

c#

file

so what I am creating dll type files, running them and then I want to delete them.

However when I try to delete them I get an exception as it claims they are still in use by another process.

I assuming that the code used to create the files does not dispose of resources correctly to allow the deleting of the file after, here is my code to create the file.

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

The code to delete the file is quite simple and is as follows,

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

Any idea as to why I can't delete the files?

like image 638
RobouteGuiliman Avatar asked Nov 08 '22 19:11

RobouteGuiliman


1 Answers

See the notes at CompilerResults.CompiledAssembly Property

The get accessor for the CompiledAssembly property calls the Load method to load the compiled assembly into the current application domain. After calling the get accessor, the compiled assembly cannot be deleted until the current AppDomain is unloaded.

So when you do this:

Assembly assembly = results.CompiledAssembly;

You have loaded the compiled assembly into the current app domain and thus have locked the file. To be able to delete the generated file, you would need to load it into a separate app domain (this answer may help with specifics for doing that).

like image 139
crashmstr Avatar answered Dec 06 '22 05:12

crashmstr