2016-11-24 13 views
0

исследовал много тем об этом исключении, не повезло. мой простой код:C# программа зависает, когда я пытаюсь удалить файл, который используется

  string t = Path.GetTempFileName(); 
      t = t.Remove(t.Length - 11, 11); 
      var q = Directory.EnumerateFiles(t, "tmp????.tmp"); 

      var f = q.ToList(); 
      for (int i = 0; i < q.Count(); i++) 
      { 
       //  if (Helper.CanReadFile(f[i])) 
       try 
       { 
        File.Delete(f[i]); 
       } 
       catch (IOException) 
       { 

        break; 
       } 

      } 

Я запустил этот код в закрытии события mainwindow. Таким образом, он удаляет несколько файлов, попадает в исключение, а затем выполняет оператор «break», а затем .. где-то. Просто зависает и приостанавливает отладчик. Я попробовал несколько фрагментов кода, чтобы определить, используется ли файл перед удалением, но он получает исключение внутри этого кода (например, Helper.CanReadFile) и останавливает там поток программ. Мне действительно не нужно удалять все файлы, но мне нужно остановить это замораживание. Как я могу работать с этим исключением, чтобы не замораживать мою программу?

некоторые править с точкой останова и информацией для большинства из них.

1) получил исключение http://imgur.com/a/k6of3

2) первый шаг от него, ничего особенного http://imgur.com/a/FvWjz

3) вернулся к отчуждать http://imgur.com/a/LMdiA

4) вернулся к методу события http://imgur.com/a/FlIUf

5), который был вызван из onclose http://imgur.com/a/YQUrZ

6) после этого он петляет здесь некоторое время (я использую глобальную горячую клавишу) http://imgur.com/a/0qjdf он отключается после ~ 10 циклов с msg = 130. и моя программа закрывается штрафом, если я удаляю часть удаления файла.

7) заморожена часть (код не работает сообщение) http://imgur.com/a/WeEGj

+0

«то .. где-то». Вы должны расследовать. Поместите точку останова в оператор break, затем шаг за шагом перейдите в отладчик –

+1

. Что такое оператор break для anyways?вы действительно хотите прекратить удаление всех файлов только потому, что удаление какого-либо не удалось? – nozzleman

+0

@nozzleman: ты прав. Мы не можем удалить определенный файл, это не означает, что вы пропустите все остальные ... –

ответ

0

При удалении файлов вы можете попробовать это:

Чтобы запустить этот код на фоне тему вы можете сделать несколько вещей:

Перейдите на страницу private async Task DeleteAllTempFiles() и позвоните по телефону без ждут!

ИЛИ

new Thread(() => { DeleteAllTempFiles(); }).Start();

private void DeleteAllTempFiles() 
{ 
    try 
    { 
     //Get the temp Path 
     DirectoryInfo tempDir = new DirectoryInfo(Path.GetTempPath()); 
     //Get all matching files 
     List<FileInfo> tempFiles = tempDir.GetFiles("tmp????.tmp", SearchOption.AllDirectories).ToList(); 

     //Collect all files that fail to delete 
     List<FileInfo> cannotDelete = new List<FileInfo>(); 

     //Delete Files: 
     DeleteFiles(tempFiles, out cannotDelete); 

     //Show what failed (and retry or whatever) 
     string message = "Cannot delete the following file(s):"; 
     cannotDelete.ForEach(file => message += "{file.FullName}{Environment.NewLine}"); 
     MessageBox.Show(message, "Result"); 
    } 
    catch (Exception ex) 
    { 
     Debug.Fail(ex.Message); 
    } 
} 

private void DeleteFiles(List<FileInfo> filesToDelete, out List<FileInfo> failedToDelete) 
{ 
    foreach(FileInfo file in filesToDelete) 
    { 
     try 
     { 
     file.Delete(); 
     } 
     catch (IOException ioEx) 
     { 
     failedToDelete?.Add(file); //<-- Check if failedToDelete != null !!! 
     //This will always happen. 
     //Since its not "hard fail" you should log it but keep goin ! 
     //MessageBox.Show($"IO-Exception: {ioEx.Message}"); 
     } 
     catch (Exception ex) 
     { 
     MessageBox.Show($"Exception: {ex.Message}"); 
     } 
    } 
} 

Если вы хотите работать с файлами, вы не можете удалить вы можете обработать их с этим: How do I find out which process is locking a file using .NET?

Для быстрой проверки какие замки ваши файлы, которые вы можете использовать: OpenedFilesView или Windows Sysinternals Process Explorer

Может быть, вы можете попытаться установить некоторые атрибуты ... Может быть, вы можете получить доступ с этим:

enter image description here

Извините за плохой размер изображения ..

+0

ok, он пытается удалить файлы, не удаляя 3 из них, показывает Msgbox с ioexception infos (эта строка -> //MessageBox.Show($"IO-Exception: {ioEx.Message} ");), затем показывает результат с 3 именами, затем у меня есть экран, как это http://imgur.com/a/WeEGj. Я чувствую, что какая-то работа с этим не удаленным файлом выполняется неправильно, но не знаю, что именно. – user1193962

+0

ok Я вставил код из вашей ссылки, он показывает, что только моя программа использует файл. например: foreach (var fileInfo in outList) { var z = FileUtil.WhoIsLocking (fileInfo.FullName); строка t = ""; z.ForEach (pr => t + = pr.ProcessName); MessageBox.Show (t); } Мне показывают «myProgramName.vshost» – user1193962

+0

Хорошо. Но зачем вы хотите удалять файлы Visual Studio создает ** временную ** во время debuggin? Это похоже на саботаж вашей собственной программы ... –