Принудительное закрытие открытого файла с помощью С#

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

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

В основном мне нужно обрабатывать файлы в каталоге, который создается приложением, которое не очищает его. Я знаю, что приложение обрабатывается, когда мои вызовы, но мне нужно убить блокировки, когда я запускаю. Кроме того, кажется, что я противоречу чтению из локального программного обеспечения AV, сканирующему удаленный доступ, где находится сервер.

Все это добавляет к неразрешимой ситуации "сила закрытия", поэтому я могу делать то, что мне нужно. Кто-нибудь есть идея, что делать?

Ответ 1

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

Как узнать, какой процесс блокирует файл с помощью .NET?

Затем в этом сообщении описывается способ их закрытия:

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/04a1e899-2a38-4d95-8ed5-6d53344e4d76

Ответ 2

Это, вероятно, не имеет значения, и если это кто-то прокомментировал, но был обход, который я использовал в проводнике, прежде чем обойти блокировки файлов.
Если файл был заблокирован процессом, который умер. Windows часто не позволял вам его удалять, но если вы создали новый файл с тем же именем в другом месте, переместите его в папку, это будет успешным. Затем вы можете удалить новый файл, и все было хорошо.
Чтобы использовать это для своего приложения, вам нужно будет прочитать файл и удерживать его в памяти, прежде чем вы это сделаете, тогда вы напишете его обратно после того, как вы избавитесь от старого.
Может быть, это поможет, может быть, нет, но стоит попробовать.

Ответ 3

    foreach (var process in Process.GetProcessesByName("excel")) //whatever you need to close 
    {
        if (process.MainWindowTitle.Contains("test.xlsx"))
        {
            process.Kill();
            break;
        }
    }

или

    foreach (var process in Process.GetProcesses())
    {
        if (process.MainWindowTitle.Contains("test.dat"))
        {
            process.Kill();
            break;
        }
    }