Как я удаляю файл, который заблокирован другим процессом в C#?

Я придумал свое решение. Используйте этот метод, передайте любой документ ( dict , list , ObjectId и т. Д.) Для сериализации.

def getSerializable(doc):
    # check if it's a list
    if isinstance(doc, list):
        for i, val in enumerate(doc):
            doc[i] = getSerializable(doc[i])
        return doc

    # check if it's a dict
    if isinstance(doc, dict):
        for key in doc.keys():
            doc[key] = getSerializable(doc[key])
        return doc

    # Process ObjectId
    if isinstance(doc, ObjectId):
        doc = str(doc)
        return doc

    # Use any other custom serializting stuff here...

    # For the rest of stuff
    return doc
54
задан ckittel 20 August 2011 в 12:34
поделиться

7 ответов

Уничтожение других процессов не является здоровой вещью сделать. Если Ваш сценарий включает что-то как удаление, Вы могли бы использовать MoveFileEx API-функция для маркировки файла для удаления на следующую перезагрузку.

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

36
ответ дан Uwe Keim 7 November 2019 в 08:05
поделиться

Типичный метод следующие. Вы сказали, что хотите сделать это в C#, таким образом, здесь идет...

  1. , Если Вы не знаете, какому процессу заблокировали файл, необходимо будет исследовать список дескриптора каждого процесса и запросить каждый дескриптор, чтобы определить, определяет ли это заблокированный файл. Выполнение в этом C#, вероятно, потребует, чтобы P/Invoke или посреднический C++ / CLI назвали встроенные API, в которых Вы будете нуждаться.
  2. , Как только Вы выяснили, какому процессу (процессам) заблокировали файл, необходимо будет безопасно ввести маленький собственный DLL в процесс (можно также ввести управляемый DLL, но это более грязно, поскольку тогда необходимо запустить или присоединить ко времени выполнения.NET).
  3. , Что DLL начальной загрузки тогда закрывает использование дескриптора CloseHandle, и т.д.

По существу: способ разблокировать "заблокированный" файл состоит в том, чтобы ввести файл DLL в незаконное адресное пространство процесса и закрыть его самостоятельно. Можно сделать этот использующий собственный или управляемый код. Неважно, что, Вы собираетесь нуждаться в небольшом количестве собственного кода или по крайней мере P/Invoke в то же.

Полезные ссылки:

Удачи!

15
ответ дан Peter Mortensen 7 November 2019 в 08:05
поделиться

Если Вы хотите сделать это программно. Я не уверен..., и я действительно рекомендовал бы против него. Если Вы просто диагностируете материал на своей собственной машине, , Проводник Процесса SysInternals может помочь Вам

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

можно тогда удалить файл и так далее.

Остерегаются , делание этого может вызвать программу, которая владеет дескрипторами для поведения странно, поскольку Вы только что вытянули общеизвестный коврик из-под него, но это работает хорошо при отладке собственного ошибочного кода, или когда Visual Studio / Windows Explorer является дерьмом и не выпускает дескрипторы файлов даже при том, что Вы сказали им закрываться, файл давным-давно... вздыхают:-)

7
ответ дан Orion Edwards 7 November 2019 в 08:05
поделиться

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

При удалении файла может ожидать, Вы могли определить его для удаления, когда Ваш компьютер затем запускает:

  1. Запускаются REGEDT32 (W2K) или REGEDIT (WXP) и перешли к:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
    
  2. W2K и WXP

    • W2K:
      Редактирование
      Добавленная стоимость...
      Тип данных: REG_MULTI_SZ
      Имя Значения: PendingFileRenameOperations
      OK

    • WXP:
      Редактирование
      Новый
      Мультистроковое Значение
      вводит
      PendingFileRenameOperations

  3. В область Data, входит "\??\" + filename, чтобы быть удаленным. LFNs может быть введен, не будучи встроенным в кавычки. Для удаления C:\Long Directory Name\Long File Name.exe введите следующие данные:

    \??\C:\Long Directory Name\Long File Name.exe
    

    Тогда нажатие хорошо .

  4. "целевое имя файла" является пустой (нулевой) строкой. Это вводится следующим образом:

    • W2K:
      Редактирование
      Двоичный файл
      избранный Формат данных: Шестнадцатеричное число
      щелчок в конце шестнадцатеричной строки
      входит 0000 (четыре нуля)
      OK

    • WXP:
      Щелкают правой кнопкой по значению
      , выбирают "Modify Binary Data"
      , щелчок в конце шестнадцатеричной строки
      входит 0000 (четыре нуля)
      OK

  5. Близко REGEDT32/REGEDIT и перезагрузка для удаления файла.

<глоток> (Бесстыдно украденный от [1 111] некоторый случайный форум , для пользы потомства.)

4
ответ дан H. Pauwelyn 7 November 2019 в 08:05
поделиться

Используя совет Orion Edwards я загрузил Sysinternal Process  Проводник , который в свою очередь позволил мне обнаруживать, что файл я испытывал затруднения при удалении, был на самом деле сохранен не эти Excel.Applications объект, я думал, а скорее то, что мой код C# отправляет почтовый код, создало объект Вложения, который оставил дескриптор этому файлу открытым.

, Как только я видел это, я довольно простой обратился к расположить методу объекта Вложения, и дескриптор был выпущен.

проводник Sysinternal позволил мне обнаруживать используемый в сочетании с Visual  Studio  отладчик 2005 года.

я настоятельно рекомендую этот инструмент!

4
ответ дан Peter Mortensen 7 November 2019 в 08:05
поделиться

О, один большой взлом, который я использовал несколько лет назад, то, что Windows не позволит Вам , удаляют файлы, но это действительно позволяет Вам перемещение их.

Pseudo-sort-of-code:

mv %WINDIR%\System32\mfc42.dll %WINDIR\System32\mfc42.dll.old
Install new mfc42.dll
Tell user to save work and restart applications

, Когда перезапущенные приложения (отмечают, что мы не должны были перезагружать машину), они загрузили новое mfc42.dll, и все было хорошо. Это, вместе с PendingFileOperations для удаления старого в следующий раз целая перезапущенная система, работало вполне прилично.

3
ответ дан Orion Edwards 7 November 2019 в 08:05
поделиться

Это выглядит многообещающим. Способ уничтожить дескриптор файла....

http://www.timstall.com/2009/02/killing-file-handles-but-not-process.html

3
ответ дан Redandwhite 7 November 2019 в 08:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: