2011-08-08 20 views
6

Tôi đã đọc bài viết này (Can't delete a file using threads) về vấn đề của tôi nhưng mọi thứ đang trở nên khó khăn với tôi.Xóa tệp bằng C# Chủ đề

Vấn đề của tôi rất đơn giản, tôi chỉ muốn xóa tệp cũ này, nếu tôi bắt đầu phương pháp "dlMoveNovaVersao" bình thường thì tệp sẽ bị xóa nhưng nếu tôi đặt nó lên một chủ đề (như dưới đây) cho phép ". Ai đó biết vấn đề là gì? (Tôi muốn sử dụng thread).

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

Chỉ tả mục đích, chương trình của tôi (Supervisor Starter) kiểm tra trên trang web nếu tôi có một phiên bản cũ của "Giám sát" chạy (sử dụng XML), Nếu đó là sự thật của tôi "Giám sát Starter" xác minh nếu có một quá trình gọi là "Giám sát" chạy và giết nó sau đó "Giám sát Starter" tải về phiên bản mới và chạy nó. (Chương trình nhỏ và bản cập nhật không mất nhiều hơn sau đó 4 giây).

Sự cố bắt đầu khi "Người giám sát bắt đầu" của tôi thử xóa phiên bản cũ của chương trình của tôi. Nếu tôi sử dụng thread tôi nhận được "Tôi không có quyền truy cập vào tập tin", nếu tôi sử dụng cùng một phương pháp trên lớp Form tập tin sẽ bị xóa.

+1

dân có thể thường có vấn đề này, đó là một cổ điển luồng câu hỏi imho, và như vậy tốt của nó để xem mức độ câu hỏi ở đây. –

Trả lời

4

Tôi nghi ngờ rằng bạn đang chạy luồng trong khi tệp đang sử dụng. Khi luồng chạy, nó chạy song song với luồng hiện tại. Bạn đã đảm bảo rằng tệp đó đã bị đóng chưa ?.

Nếu không, tôi nghĩ rằng chuỗi có thể được tạo bằng thông tin xác thực không phải của bạn. Nhưng tôi khá chắc chắn đây không phải là trường hợp.

Xem nếu điều này là khác nhau đối với từng trường hợp

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

đồng ý, một trong hai tôi nghĩ. Tôi tự hỏi whats rất tốt về câu hỏi này mặc dù. –

+0

Đặt trước, tệp của tôi đã bị đóng. Hệ thống nói "Tôi không có quyền" – Carvrodrigo

0

Đây là chức năng của tôi để xóa file trong đề nếu các tập tin đang sử dụng

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, cảm ơn vì sự giúp đỡ nhưng tập tin không được sử dụng, trước khi mã này tôi điền một mảng với tất cả các quá trình và tắt máy "giám sát" (Đó là làm việc tôi đã kiểm tra lại rằng). – Carvrodrigo