2016-05-10 24 views
-2

些細なエラー、時間はファイルを削除するのと同じプロセスを実行する別の時間の通常の処理を実行します。私はこのエラーを受け取ります。パスへのアクセスが拒否されました。

これはIIS経由でアクセスされているWebサイトフォルダの更新プログラムで、ユーザーがWebサイトにログオンしている間にこのプロセスが発生します。

何ができますか?

Exception.Message =

パスへのアクセスは 'W:\のinetpub \ wwwrootの\サイト\ Recursos \ CSSの\フォント\ roboto-light_0-webfont.ttf' が拒否されます。

メッセージ:「W:¥inetpub¥wwwroot¥site¥Recursos¥Css¥Fonts¥roboto-light_0-webfont.ttf」パスへのアクセスが拒否されました。 StackTrace:System.IO.__でError.WinIOError(Int32 errorCode、String maybeFullPath)をSystem.IO.File.SetAttributes(String path、FileAttributes fileAttributes)で呼び出すと、次のエラーメッセージが表示されます。 d:¥WOOBA_WORKSPACE_2010¥WoobaWebDesk¥Source¥Development¥aspWoobaWebDesk¥サービスプロバイダユーザ名¥Utilitarios¥Pacote.cs:d:¥WOOBA_WORKSPACE_2010¥WoobaWebDesk内のサービスプロバイダの作業行.Pacote.DeleteDirectory(String target_dir、List 1 Ignorar, Boolean deletarRaiz) in d:\WOOBA_WORKSPACE_2010\WoobaWebDesk\Source\Development\aspWoobaWebDesk\ServicoAtualizador\Utilitarios\Pacote.cs:line 37 at ServicoAtualizador.Utilitarios.Pacote.DeleteDirectory(String target_dir, List 1 Ignorar、Boolean deletarRaiz)の行46 \ WOOBA_WORKSPACE_2010 \ WoobaWebDesk \ Source \ Development \ aspWoobaWebDesk \ ServicoAtualizador \ ServicePattern.Utilitarios.Pacote.DeleteDirectory(文字列target_dir、リスト1 Ignorar, Boolean deletarRaiz) in d:\WOOBA_WORKSPACE_2010\WoobaWebDesk\Source\Development\aspWoobaWebDesk\ServicoAtualizador\Utilitarios\Pacote.cs:line 37 at ServicoAtualizador.Processamento.ProcessarAtualizacao(String Aplicacao, DirectoryItem arquivo, AtualizacaoItemProduto itemProduto, AtualizacaoItem item, List 1 colecao)で、ソース\開発\ aspWoobaWebDesk \サービスプロバイダー\ Utilitarios \ Pacote.cs: Processamento.cs:227行ソース:mscorlib

CODE:

public static void DeleteDirectory(string target_dir, List<string> Ignorar = null, bool deletarRaiz = true) 
    { 
     string[] files = Directory.GetFiles(target_dir); 
     string[] dirs = Directory.GetDirectories(target_dir); 

     DeletarArquivos(Ignorar, files); 

     foreach (string dir in dirs) 
     { 
      DeleteDirectory(dir); 
     } 

     if (deletarRaiz) 
     { 
      int contador = 0; 
      while (Directory.GetFiles(target_dir).Any()) // prevent directory is not empty 
      { 
       System.Threading.Thread.Sleep(200); 
       DeletarArquivos(Ignorar, Directory.GetFiles(target_dir)); 
       contador++; 
       if (contador >= 3) 
        throw new ArgumentException("Não possível deletar os arquivos, diretório:" + target_dir); 
      } 

      Directory.Delete(target_dir, false); 
     } 
    } 

    private static void DeletarArquivos(List<string> Ignorar, string[] files) 
    { 
     foreach (string file in files) 
     { 
      FileInfo Info = new FileInfo(file); 

      if (Ignorar != null) 
      { 
       if (Ignorar.Any(o => o.Equals(Info.Name, StringComparison.OrdinalIgnoreCase))) 
        continue; 
      } 

      if (Info.IsReadOnly) 
       Info.IsReadOnly = false; 

      var attr = File.GetAttributes(file); 

      if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      { 
       File.SetAttributes(file, attr^FileAttributes.ReadOnly); 
      } 
      File.SetAttributes(file, FileAttributes.Normal); //...error here 
      File.Delete(file); 
     } 
    } 

答えて

0

あり、あなたがその例外を取得したい理由の任意の数がありますが、何が起こっているかについての詳細を知らなくても、それは言うことは不可能です。ファイルがIIS経由でアップロードされた場合、IISは引き続きそのファイルを処理できる可能性があります。ストリームやファイルへのアクセスが禁止されていますか?

いずれにしても、try/catchブロックでファイルを削除しようとする試みをラップし、失敗を記録します。これにより、アプリケーションがクラッシュすることはなく、問題の原因となっているファイルを簡単に確認できます。それは次回削除しようとするかもしれない、それは動作します。ファイルが保持されている期間によって異なります。

私が言ったように、これ以上の背景がなければ、私たちは言うことはできませんが、try/catchはあなたがこのような場合に常に行うべきことなので、それを追加し、

希望に役立ちます。

関連する問題