File.Exists + File.Move Ошибка "Процесс не может получить доступ к файлу, потому что он используется другим процессом".

У меня есть то, что я думал, будет очень простой скрипт перемещения файлов. Он проверяет файл и перемещает его в новый каталог, если он существует:

if (File.Exists(_collection[x,0]))
{
    System.IO.File.Move(_collection[x, 0], _moveTo);
    MessageBox.Show("File moved because it was stale.");
}

Он проходит проверку того, что файл существует, но затем выдает ошибки в следующей строке при попытке переместить его, заявляя, что файл используется другим процессом. Я могу только предположить, что File.Exists заставляет его как-то зависать, но не может найти решение от кого-то еще, кто имел эту проблему.

1 ответ

Решение

Попробуйте этот код:

    string filePathNameToMove = "";
    string directoryPathToMove = "";

    if (File.Exists(filePathNameToMove))
    {
        string destinationFilePathName = 
               Path.Combine(directoryPathToMove, Path.GetFileName(filePathNameToMove));
        if (!File.Exists(destinationFilePathName))
        {
            try
            {
                File.Move(filePathNameToMove, destinationFilePathName);
                Console.WriteLine("File Moved!");
            }
            catch (Exception e)
            {
                Console.WriteLine("File Not Moved! Error:" + e.Message);

            }
        }
    }

В случае, если у кого-то еще есть эта проблема. В моем случае файл был открыт в Excel, и после его завершения Excel никогда не собирал мусор. Таким образом, ОС все еще думала, что к файлу обращаются. Я сделал следующее, сырой, но это работает.

                for (int i = 1; i > 0; i++)
                {
                     try
                     {
                         File.Move(sourceFileName, destinationFileName);
                         break;
                     } catch
                     {
                         GC.Collect();
                     }
                }
Другие вопросы по тегам