Принудительное закрытие открытого файла с помощью C # - PullRequest
14 голосов
/ 20 августа 2010

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

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

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

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

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

2 голосов
/ 20 августа 2010

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

1 голос
/ 17 октября 2017
    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;
        }
    }
...