MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Освободить файл от процесса - как усовершенствовать этот код?"
Answer 1225636
Не глядя натравливать TerminateProcess на любой процесс, который держит файл, весьма сомнительная идея. Помимо обычного приложения, файл может быть открыт системной службой. Например, если файл лежит в общей сетевой папке и открыт с другого компьютера, ваш код прибьет службу общих файлов. Собственно, Restart Manager для того и создан, чтобы корректно обрабатывать подобные ситуации. Вместо TerminateProcess используйте RmShutdown и RmRestart:
void FreeProcess(const WCHAR* file) { DWORD hSess = 0; WCHAR key[50] = L"MySession"; DWORD res; res = RmStartSession(&hSess, 0, key); if (res != 0) { // Cannot start session return; } LPCWSTR filenames[] = { file }; res = RmRegisterResources(hSess, 1, filenames, 0, NULL, 0, NULL); if (res != 0) { // Cannot register resource RmEndSession(hSess); return; } UINT procInfoNeeded; UINT procInfo = 10; DWORD rebootReasons; RM_PROCESS_INFO info[10]; res = RmGetList(hSess, &procInfoNeeded, &procInfo, info, &rebootReasons); if (res != 0) { // Cannot get list of processes RmEndSession(hSess); return; } for (int i = 0; i < procInfo; i++) wprintf(L"%u: %s\n", info[i].Process.dwProcessId, info[i].strAppName); res=RmShutdown(hSess, RmForceShutdown, NULL); //останавливаем процесс if (res != 0) { fputws(L"RmShutdown failed",stdout); RmEndSession(hSess); return; } //выполняем необходимые операции с файлом... RmRestart(hSess, 0, NULL); //перезапускаем процесс, если это поддерживается RmEndSession(hSess); }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.