2016-02-11 4 views
0

Мне нужно удалить каталог с файлом exe приложения. Это выглядит следующим образом:C# Разблокировка каталога и копирование файлов

  1. Начало App.exe из C: \ Folder \ App.exe
  2. App.exe само копирование в C: \ User \ Temp \ temp.exe
  3. App .exe закрывает себя и запустить temp.exe
  4. temp.exe удаляет app.exe и C: \ каталог Папка

Это хорошо выглядеть, но когда я копирование App.exe для Temp.exe, процесс Temp.exe по-прежнему использует C: \ Folder. Независимо от того, что я делаю, каждый процесс, который я начал, блокирует мой каталог.

Я создал приложение формы с кнопкой, чтобы проверить их поведение.

bool del = false; 
    public Form1(string[] args) 
    { 
     InitializeComponent(); 
     this.Text = Process.GetCurrentProcess().Id.ToString(); 
     if (args.Length > 0 && args[0] == "arg1") 
     { 
      Process proc = Process.GetProcessById(Convert.ToInt32(args[1])); 
      proc.Kill(); 
     } 
     else if (args.Length > 0 && args[0] == "arg2") 
     { 
      del = true; 
     } 
     else 
     { 
      string tempfile = Environment.GetEnvironmentVariable("TEMP") + "\\Temp.exe"; 
      File.Copy(Application.ExecutablePath, tempfile, true); 
      Process proc = new Process(); 
      proc.StartInfo.FileName = tempfile; 
      proc.StartInfo.Arguments = String.Format("arg1 {0}", Process.GetCurrentProcess().Id); 
      proc.Start(); 
      Application.Exit(); 
     } 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     if (del == true) 
     { 
      string ApplicationPath = @"C:\Folder"; 
      DirectoryInfo directory = new DirectoryInfo(ApplicationPath); 
      foreach (FileInfo file in directory.GetFiles()) file.Delete(); 
      Directory.Delete(ApplicationPath); 
     } 
     else 
     { 
      ProcessStartInfo Info = new ProcessStartInfo(); 
      Info.Arguments = "/C ping 127.0.0.1 -n 2 && \"" + Application.ExecutablePath + "\" arg2"; 
      Info.WindowStyle = ProcessWindowStyle.Hidden; 
      Info.CreateNoWindow = true; 
      Info.FileName = "cmd.exe"; 
      Process.Start(Info); 
     } 
    } 

Вкратце - я ищу решение, которое удалит исходный файл exe с родительским каталогом.

Надежды на помощь. Благодарю.

+0

В основном угадайте, но, возможно, вам нужно сначала изменить текущий рабочий каталог? https://msdn.microsoft.com/en-us/library/system.io.directory.setcurrentdirectory – David

+1

В вашем обработчике событий нажатия кнопки, если del == true ... внутри этого оператора if проверяет, что файлы в папка не используется –

+0

@ David спасибо! Я меняю рабочий каталог, и теперь все в порядке. – user5817386

ответ

1

Я подозреваю, что проблема заключается в том, что приложение по-прежнему работает из текущего каталога, даже если он запускает отдельный исполняемый файл. Рассмотрим, например, командную строку:

C:\SomeFolder>../AnotherFolder/SomeProgram.exe 

Хотя SomeProgram может быть в AnotherFolder, я себя утра «в» SomeFolder и, таким образом, сохраняя открытую ссылку на него. Поэтому его нельзя удалить.

Вы должны уметь change the current working directory из кода. Что-то вроде этого:

Directory.SetCurrentDirectory(@"C:\User\Temp"); 
Смежные вопросы