2011-08-08 10 views
6

Estaba leyendo este artículo (Can't delete a file using threads) sobre mi problema pero las cosas se me están poniendo difíciles.Eliminar archivo usando C# Hilo

Mi problema es realmente simple, solo quiero eliminar este viejo archivo, si comienzo el método "dlMoveNovaVersao" normalmente el archivo se elimina pero si pongo esto en un hilo (como abajo) recibí "No eres permitir". Alguien sabe cuál es el problema? (Quiero usar hilo).

private void verificaVersaoSupervisor_Tick(object sender, EventArgs e) 
    { 
     Thread threadConexao = new Thread(threadVerificaConexao); 
     threadConexao.Start(); 
    } 

    public void threadVerificaConexao() 
    { 
     try 
     { 
      Dns.GetHostEntry("www.google.com.br"); 
      if (verificaVersao()) 
      { 
       try 
       { 
        verificaKillSupervisor(); 
        dlMoveNovaVersao(); 
        Application.Exit(); 
       } 
       catch (Exception) 
       { } 
      } 
      else 
      { 
       Application.Exit(); 
      } 
     } 
     catch (Exception) 
     { } 
    } 

    public void dlMoveNovaVersao() 
    { 
     WebClient webClient = new WebClient(); 
     webClient.DownloadFile("Anywebsite", @"c:\temp\supervisor.exe); 
     try 
     { 
      File.Delete(@"c:\Test\supervisor.exe); //This file is always there! 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.Message); 
     } 

Sólo puedo describirlo con el propósito, Mi programa (supervisor de arranque) comprobar en la página web si tengo una versión antigua de "supervisor" en ejecución (XML), si bien es cierto que mi "Supervisor de arranque" verificar si hay una proceso llamado "Supervisor" ejecutándose y elimínalo después de que "Supervisor Starter" descargue la nueva versión y ejecútela. (El programa es pequeño y la actualización no toma más de 4 segundos).

El problema comenzó cuando mi "Supervisor Starter" intenté eliminar la versión anterior de mi programa. Si utilizo thread recibo "No tengo permiso para acceder al archivo", si utilizo el mismo método en la clase Form, el archivo se elimina.

+1

personas pueden a menudo tienen este problema, que es un clásico Enhebrar la pregunta, y como tal, es bueno ver este nivel de pregunta aquí. –

Respuesta

4

Sospecho que está ejecutando el hilo mientras el archivo está en uso. Cuando se ejecuta el hilo, se ejecuta en paralelo con el hilo actual. ¿Se ha asegurado de que ese archivo esté cerrado ?.

De lo contrario, creo que el hilo tal vez se está creando con credenciales que no son suyas. Pero estoy bastante seguro de que este no es el caso.

ver si esto es diferente para cada caso

catch (Exception err) 
    { 
     MessageBox.Show("User {0}. Message {1}", 
         System.Security.Principal.WindowsIdentity.GetCurrent().Name, 
         err.Message); 
    } 
+0

de acuerdo, cualquiera de los dos, creo. Sin embargo, me pregunto qué tiene de bueno esta pregunta. –

+0

Preet, mi archivo estaba cerrado. El sistema dijo "No tengo permiso" – Carvrodrigo

0

Ésta es mis funciones para eliminar archivos en hilos si los archivos están en utilizadas

private static void Delete(System.IO.FileInfo file) 
    { 
     if (file.Exists) 
     { 
      int Attempt = 0; 
      bool ShouldStop = false; 
      while (!ShouldStop) 
      { 
       if (CanDelete(file)) 
       { 
        file.Delete(); 
        ShouldStop = true; 
       } 
       else if (Attempt >= 3) 
       { 
        ShouldStop = true; 
       } 
       else 
       { 
        // wait one sec 
        System.Threading.Thread.Sleep(1000); 
       } 

       Attempt++; 
      } 
     } 
    } 

    private static bool CanDelete(System.IO.FileInfo file) 
    { 
     try 
     { 
      //Just opening the file as open/create 
      using (FileStream fs = new FileStream(file.FullName, FileMode.OpenOrCreate)) 
      { 
       //If required we can check for read/write by using fs.CanRead or fs.CanWrite 
      } 
      return false; 
     } 
     catch (IOException ex) 
     { 
      //check if message is for a File IO 
      string __message = ex.Message.ToString(); 
      if (__message.Contains("The process cannot access the file")) 
       return true; 
      else 
       throw; 
     } 
    } 
+0

Juidan, gracias por la ayuda, pero el archivo no estaba en uso, antes de este código, llené una matriz con todo el proceso y cerré el "supervisor" (Está funcionando, he comprobado que) – Carvrodrigo