Ответ 1
Сначала вы можете использовать это сообщение, чтобы убедиться, что это хитрое приложение, которое их блокирует:
Как узнать, какой процесс блокирует файл с помощью .NET?
Затем в этом сообщении описывается способ их закрытия:
Я нашел аналогичный вопрос здесь, но он был закрыт/принят с ответом "не делай этого".
Я в ситуации, когда меня не волнует, что происходит с другими приложениями, я хочу взять файл, который может быть заблокирован другими (грубо, если необходимо) и иметь с ним дорогу. Мне может понадобиться переместить, переименовать или удалить этот файл.
В основном мне нужно обрабатывать файлы в каталоге, который создается приложением, которое не очищает его. Я знаю, что приложение обрабатывается, когда мои вызовы, но мне нужно убить блокировки, когда я запускаю. Кроме того, кажется, что я противоречу чтению из локального программного обеспечения AV, сканирующему удаленный доступ, где находится сервер.
Все это добавляет к неразрешимой ситуации "сила закрытия", поэтому я могу делать то, что мне нужно. Кто-нибудь есть идея, что делать?
Сначала вы можете использовать это сообщение, чтобы убедиться, что это хитрое приложение, которое их блокирует:
Как узнать, какой процесс блокирует файл с помощью .NET?
Затем в этом сообщении описывается способ их закрытия:
Это, вероятно, не имеет значения, и если это кто-то прокомментировал, но был обход, который я использовал в проводнике, прежде чем обойти блокировки файлов.
Если файл был заблокирован процессом, который умер. Windows часто не позволял вам его удалять, но если вы создали новый файл с тем же именем в другом месте, переместите его в папку, это будет успешным. Затем вы можете удалить новый файл, и все было хорошо.
Чтобы использовать это для своего приложения, вам нужно будет прочитать файл и удерживать его в памяти, прежде чем вы это сделаете, тогда вы напишете его обратно после того, как вы избавитесь от старого.
Может быть, это поможет, может быть, нет, но стоит попробовать.
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;
}
}