Я придумал свое решение. Используйте этот метод, передайте любой документ ( 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
Уничтожение других процессов не является здоровой вещью сделать. Если Ваш сценарий включает что-то как удаление, Вы могли бы использовать MoveFileEx
API-функция для маркировки файла для удаления на следующую перезагрузку.
, Если кажется, что действительно необходимо удалить файл, используемый другим процессом, я рекомендовал бы пересмотреть фактическую проблему прежде, чем рассмотреть любые решения.
Типичный метод следующие. Вы сказали, что хотите сделать это в C#, таким образом, здесь идет...
По существу: способ разблокировать "заблокированный" файл состоит в том, чтобы ввести файл DLL в незаконное адресное пространство процесса и закрыть его самостоятельно. Можно сделать этот использующий собственный или управляемый код. Неважно, что, Вы собираетесь нуждаться в небольшом количестве собственного кода или по крайней мере P/Invoke в то же.
Полезные ссылки:
Удачи!
Если Вы хотите сделать это программно. Я не уверен..., и я действительно рекомендовал бы против него. Если Вы просто диагностируете материал на своей собственной машине, , Проводник Процесса SysInternals может помочь Вам
Выполнение это, использовать команду Find Handle (я думаю, что это или в находке или в меню дескриптора), и ищите название своего файла. Как только дескриптор (дескрипторы) найден, можно насильственно закрыть их.
можно тогда удалить файл и так далее.
Остерегаются , делание этого может вызвать программу, которая владеет дескрипторами для поведения странно, поскольку Вы только что вытянули общеизвестный коврик из-под него, но это работает хорошо при отладке собственного ошибочного кода, или когда Visual Studio / Windows Explorer является дерьмом и не выпускает дескрипторы файлов даже при том, что Вы сказали им закрываться, файл давным-давно... вздыхают:-)
Можно использовать эту программу, Дескриптор , для нахождения, какой процесс имеет блокировку на файле. Это - инструмент командной строки, таким образом, я предполагаю, что Вы используете вывод от этого... Я не уверен в нахождении его программно.
При удалении файла может ожидать, Вы могли определить его для удаления, когда Ваш компьютер затем запускает:
Запускаются REGEDT32 (W2K)
или REGEDIT (WXP)
и перешли к:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
W2K и WXP
W2K:
Редактирование
Добавленная стоимость...
Тип данных: REG_MULTI_SZ
Имя Значения: PendingFileRenameOperations
OK
WXP:
Редактирование
Новый
Мультистроковое Значение
вводит
PendingFileRenameOperations
В область Data, входит "\??\" + filename
, чтобы быть удаленным. LFNs может быть введен, не будучи встроенным в кавычки. Для удаления C:\Long Directory Name\Long File Name.exe
введите следующие данные:
\??\C:\Long Directory Name\Long File Name.exe
Тогда нажатие хорошо .
"целевое имя файла" является пустой (нулевой) строкой. Это вводится следующим образом:
W2K:
Редактирование
Двоичный файл
избранный Формат данных: Шестнадцатеричное число
щелчок в конце шестнадцатеричной строки
входит 0000 (четыре нуля)
OK
WXP:
Щелкают правой кнопкой по значению
, выбирают "Modify Binary Data"
, щелчок в конце шестнадцатеричной строки
входит 0000 (четыре нуля)
OK
Близко REGEDT32/REGEDIT
и перезагрузка для удаления файла.
<глоток> (Бесстыдно украденный от [1 111] некоторый случайный форум , для пользы потомства.)
Используя совет Orion Edwards я загрузил Sysinternal Process Проводник , который в свою очередь позволил мне обнаруживать, что файл я испытывал затруднения при удалении, был на самом деле сохранен не эти Excel.Applications
объект, я думал, а скорее то, что мой код C# отправляет почтовый код, создало объект Вложения, который оставил дескриптор этому файлу открытым.
, Как только я видел это, я довольно простой обратился к расположить методу объекта Вложения, и дескриптор был выпущен.
проводник Sysinternal позволил мне обнаруживать используемый в сочетании с Visual Studio отладчик 2005 года.
я настоятельно рекомендую этот инструмент!
О, один большой взлом, который я использовал несколько лет назад, то, что 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
для удаления старого в следующий раз целая перезапущенная система, работало вполне прилично.
Это выглядит многообещающим. Способ уничтожить дескриптор файла....
http://www.timstall.com/2009/02/killing-file-handles-but-not-process.html