2012-01-15 33 views
0

当我启动我的C#程序时,我无法删除正在执行的文件。程序执行后解锁文件

我怎么能在执行后解锁我的程序集并给用户删除我的文件的可能性?也许把程序集复制到其他地方然后执行它?但我认为这不是更好的方式。

+0

看看这个,是不是很相同,但类似:http://stackoverflow.com/questions/1305428/self-deletable-application-in-c-sharp-in-one-executable – Alpha 2012-01-15 21:35:57

+1

当文件完成执行,用户应该能够删除它。 – Oded 2012-01-15 21:40:31

+0

我假设你问“执行开始后”?因为“执行后”通常意味着程序退出后,这应该是微不足道的,因为Oded指出。 – 2013-06-20 09:10:38

回答

0

我想你必须将你的程序集复制到临时位置并重新启动它。像这样的东西(没有测试过):

public class Program { 
    static void Main() { 
     if (Array.IndexOf(Environment.GetCommandLineArgs(), "/unlocked") == -1) { 
      // We have not been launched by ourself! Copy the assembly to a temp location 
      // so the user can delete our original location. 
      string temp_location = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), Path.GetFileName(Application.ExecutablePath)); 
      File.Copy(Application.ExecutablePath, temp_location); 

      Process proc = new Process(); 
      proc.StartInfo.FileName = temp_location; 
      proc.StartInfo.Arguments = "/unlocked"; 
      proc.Start(); 

      // no more work in main, so application closes... 
     } else { 
      // else initialize application as normal... 

     } 
    } 
} 
0

无法删除你的文件,因为文件本身是持有(内存)中的程序代码的虚拟内存页面的后备存储。

当您的代码页由操作系统从内存中分页出去时,它不会转到页面文件,但它只是被丢弃并且(在需要时)从文件中加载回来。

我想你可以强制程序被页面文件支持(iirc,程序从CDROM等可移动媒体执行的页面文件支持),但可能最好的解决办法是将程序集复制到另一个位置,如你所建议的。

相关问题