2011-08-08 4 views
6

私の問題についてこの記事(Can't delete a file using threads)を読んでいましたが、物事は私には難しくなっています。C#を使用してファイルを削除スレッド

私の問題は、私はメソッドを起動した場合、「dlMoveNovaVersao」は、通常、ファイルが削除されますが、私は(怒鳴るような)スレッド上でこれを置けば、私はあなたではない」だ、私はこの古いファイルを削除したい、本当に簡単です許可する "。誰かが何が問題なのかを知っていますか? (私はスレッドを使用したい)。

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

ちょうど私のプログラム(スーパーバイザースターター)は、私が実行している「スーパーバイザー」(XMLを使用して)の古いバージョンを持っている場合がある場合、それが本当なら、私の「スーパーバイザースターターは」検証のウェブサイトをご確認の上、目的をdiscribe 「スーパーバイザースターター」が新しいバージョンをダウンロードして実行した後、「スーパーバイザー」と呼ばれるプロセスが実行され、終了します。 (プログラムは小さく、アップデートには4秒以上かかることはありません)。

私の "Supervisor Starter"が私のプログラムの古いバージョンを削除しようとすると、問題が始まります。スレッドを使用すると、「私はファイルにアクセスする権限がありません」というメッセージが表示されますが、Formクラスで同じメソッドを使用するとファイルは削除されます。

+1

人々はしばしばこの問題を有していてもよく、それは古典的だ使用されるスレッド内のファイルを削除するための私の機能である参照してください。この質問のレベルをここで見ることができれば嬉しいです。 –

答えて

4

ファイルが使用中の間にスレッドを実行していると思われます。スレッドが実行されると、スレッドは現在のスレッドと並行して実行されます。そのファイルが閉じられていることを確認しましたか?

それ以外の場合は、スレッドがあなたのものではない資格情報で作成されている可能性があります。しかし、私はこれが事実ではないと確信しています。

これは、それぞれのケースについて

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

が合意した、どちらか2つの私は思う。私はこの質問について何が良いのだろうかと思う。 –

+0

Preet、ファイルが閉じられました。システムは、 "私は許可を持っていない" – Carvrodrigo

0

異なる場合、ファイルがである場合、これは

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、助けてくれてありがとう、ファイルが使用されていなかった、このコードの前に私はすべてのプロセスとシャットダウンの "監督者"で配列を埋める(それは働いている私は)。 – Carvrodrigo

関連する問題