2016-04-20 4 views
0

Я пытаюсь переместить файлы с a на b, но я получаю IOException с информацией: Access denied.Доступ к файлу запрещен во время перемещения файла

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

Исключение выбрано в вызове MoveTo() в примере ниже.

public void CreateCheckedStructure() { 

    List<string> checkedDirNew = RemoveTempFolders(GetAllFromDir(Settings.Default.NewFolder)); 
    List<string> checkedDirCurrent = RemoveTempFolders(GetAllFromDir(Settings.Default.CurrentFolder)); 

    if (checkedDirNew.Count != 0 && checkedDirCurrent.Count != 0) { 
     MyLog.WriteToLog("Moving Checked Files", MyLog.Messages.Info); 
     foreach (string checkedNew in checkedDirNew) { 
      DirectoryInfo dirInfoNew = new DirectoryInfo(checkedNew); 
      foreach (string checkedCurrent in checkedDirCurrent) { 
       DirectoryInfo dirInfoCurrent = new DirectoryInfo(checkedCurrent); 
       if (dirInfoNew.Name.Equals(dirInfoCurrent.Name)) { 
        string checkedFoldersPath = Settings.Default.CheckedTables + "\\" + dirInfoCurrent.Name + "_" + DateTime.Now.ToString("hh-mm-ss"); 
        Directory.CreateDirectory(checkedFoldersPath); 
        Directory.CreateDirectory(checkedFoldersPath + "\\New"); 
        Directory.CreateDirectory(checkedFoldersPath + "\\Current"); 
        dirInfoCurrent.MoveTo(checkedFoldersPath + "\\Current\\" + dirInfoNew.Name); 
        dirInfoNew.MoveTo(checkedFoldersPath + "\\New\\" + dirInfoCurrent.Name); 
        break; 
       } 
      } 
     } 
     MyLog.WriteToLog("All Checked Files have been moved", MyLog.Messages.Info); 
    } else { MyLog.WriteToLog("No Temporary Folder for Zips found",MyLog.Messages.Warning); } 
} 
+1

В нашем приложении мы ловим исключение, подождать несколько секунд, попробуйте еще раз. если после попытки X раз, если все еще не удалось, то что-то пошло не так. Мы исключили исключение. – urlreader

+3

Это именно то, для чего предназначена обработка исключений. Поместите блок try/catch (catch на 'IOException') вокруг неисправного кода и обработайте исключение, вернув сообщение или сделайте что-то еще, например, планируете повторить попытку позже или попросите пользователя попробовать позже. – Igor

+0

ладно, это довольно четкий тень: D thx! – Ams1

ответ

0

вы можете попробовать этот метод расширения, который я написал для решения подобного типа задачи

public static async Task<bool> TryToAsync(Action action, int timeoutInSeconds) 
     { 
      var timeout = DateTime.Now.AddSeconds(timeoutInSeconds); 
      while (DateTime.Now < timeout) 
      { 
       try 
       { 
        action(); 
        return true; 
       } 
       catch (Exception) 
       { 
        await Task.Delay(200); 
       } 
      } 

      return false; 
     } 
+0

СПАСИБО! это именно то, что я ищу. отличный метод! – Ams1

+0

, но подождите, можно ли дождаться? – Ams1

+0

Я использую C# 6, который поддерживает это – adeel41

Смежные вопросы