Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/41: Рейтинг темы: голосов - 41, средняя оценка - 4.83
-6 / 2 / 1
Регистрация: 14.08.2013
Сообщений: 80

Удалить файл, занятый(открытый) другим процессом

16.02.2021, 15:50. Показов 8259. Ответов 24

Студворк — интернет-сервис помощи студентам
Мне необходимо удалить файл, занятый(открытый) другим процессом, без его завершения. Пытаюсь найти информацию и безуспешно, буду очень благодарен, если кто знает.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2021, 15:50
Ответы с готовыми решениями:

Файл занят другим процессом =(
Уважаемые форумчане, столкнулся с некой проблемой. Для проверки лога программы, на наличие строк об ошибках, написал некий чекер этого...

Удалить файл, занятый(открытый) другим процессом
Мне необходимо удалить файл, занятый(открытый) другим процессом. Пытаюсь найти информацию и безуспешно, буду очень благодарен, если кто...

Как удалить файл, занятый другим процессом?
Уважаемые Гуру! Файл 1.gdb используется разными программами с разных компьютеров. На выделенном компьютере требуется перезаписать...

24
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
16.02.2021, 16:08
Лучший ответ Сообщение было отмечено Алексей1153 как решение

Решение

Цитата Сообщение от FROSTITAN Посмотреть сообщение
Пытаюсь найти информацию и безуспешно
плохо пытаетесь https://github.com/LloydLabs/delete-self-poc

немного переделал код для удобства
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
DWORD Sys_DeleteFile(_In_ TCHAR* lpFileName)
{
    FILE_RENAME_INFO FileReNameInfo{};
    FILE_DISPOSITION_INFO FileDispositionInfoDelete{};
    const TCHAR* StreamReName = TEXT(":wtfbbq");
 
    auto hFile = CreateFile(lpFileName, DELETE, NULL, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
 
    FileReNameInfo.FileNameLength = sizeof(StreamReName);
    RtlCopyMemory(FileReNameInfo.FileName, StreamReName, sizeof(StreamReName));
 
    if (!SetFileInformationByHandle(hFile, FileRenameInfo, &FileReNameInfo, sizeof(FileReNameInfo) + sizeof(StreamReName))) {
        GetLastError();
        return EXIT_FAILURE;
    }
 
    CloseHandle(hFile);
    
    hFile = CreateFile(lpFileName, DELETE, NULL, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
 
    FileDispositionInfoDelete.DeleteFile = TRUE;
 
    if (!SetFileInformationByHandle(hFile, FileDispositionInfo, &FileDispositionInfoDelete, sizeof(FileDispositionInfoDelete))) {
        GetLastError();
        return EXIT_FAILURE;
    }
 
    CloseHandle(hFile);
 
    if (PathFileExists(lpFileName)) {
        GetLastError();
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
5
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.02.2021, 19:18
Цитата Сообщение от FROSTITAN Посмотреть сообщение
Мне необходимо удалить файл, занятый(открытый) другим процессом, без его завершения. Пытаюсь найти информацию и безуспешно, буду очень благодарен, если кто знает.
В Windows так не получится.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
16.02.2021, 20:54
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В Windows так не получится.
почему?
код выше прекрасно удаляет файл во всех Windows (кроме ХР) не закрывает его родительский процесс.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.02.2021, 20:56
Цитата Сообщение от _lunar_ Посмотреть сообщение
код выше прекрасно удаляет файл во всех Windows (кроме ХР) не закрывает его родительский процесс.
C++
1
2
3
        wchar_t name[] = L"D:\\1.txt";
        auto h = WIN32_VERIFY_HANDLE(::CreateFileW(name, GENERIC_READ, FILE_SHARE_READ| FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, NULL));    
        Sys_DeleteFile(name);
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
16.02.2021, 21:14
oleg-m1973, ну и что это такое?
в одном апп ты создаешь файл и удаляешь. для чего?
отдельно открой процесс блокнота и отдельный апп удали свой 1.txt

да и твоя задача решается элементарным закрытием хендла
C++
1
2
3
4
TCHAR name[] = TEXT("D:\\1.txt");
auto h = CreateFile(name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, NULL);
CloseHandle(h);
Sys_DeleteFile(name);
да, в конце Sys_DeleteFile выдаст Stack around the variable (что тоже решаемо), но по итогу файл будет удалён.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.02.2021, 21:18
Цитата Сообщение от _lunar_ Посмотреть сообщение
отдельно открой процесс блокнота и отдельный апп удали свой 1.txt
Причём здесь блокнот?
Ну, сделал в разных процессах.
В первом сделал
C++
1
::CreateFileW(name, GENERIC_READ, FILE_SHARE_READ| FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, NULL)
Во втором вызвал твою Sys_DeleteFile.
Естественно, отвалилось на
C++
1
auto hFile = CreateFile(lpFileName, DELETE, NULL, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
Почему она вообще должно открывать файл, у которого не выставлено FILE_SHARE_DELETE?

Добавлено через 4 минуты
Цитата Сообщение от _lunar_ Посмотреть сообщение
да и твоя задача решается элементарным закрытием хендла
После "элементарного закрытия хэндла" можно, наверное, просто сделать DeleteFile, безо всяких извращений
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
16.02.2021, 21:21
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Почему она вообще должно открывать файл, у которого не выставлено FILE_SHARE_DELETE?
потому что ты какую-то ерунду сочиняешь.
открой любой экзешник (игру, программу, блокнот, не важно)
открыв файл, будет создан процесс, который не даст удалить файл обычным путём
собери бинарь из моего кода, вбей туда путь до открытого экзешника
в итоге экзешник удалится, процесс останется
всё, что тебе ещё надо?
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.02.2021, 21:25
Цитата Сообщение от _lunar_ Посмотреть сообщение
всё, что тебе ещё надо?
Ну, во-первых, мне от тебя вообще нихрена не надо было.
Во-вторых, вопрос вроде был
Цитата Сообщение от FROSTITAN Посмотреть сообщение
Мне необходимо удалить файл, занятый(открытый) другим процессом, без его завершения.
я тебе просто показал, что твой способ не позволяет "удалить файл, занятый(открытый) другим процессом".
Можешь верить, можешь нет - мне по-барабану.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
16.02.2021, 21:28
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
мне по-барабану
мне тем более на твой бред и высер.
ответ на вопрос, поставленный ТС я дал.
как ты его понял мне аналогично похер.

у тебя ведать на пару с TheCalligrapher подрывает одно место, а жаль, я был о тебе лучшего мнения..
1
17.02.2021, 00:32

Не по теме:

Цитата Сообщение от _lunar_ Посмотреть сообщение
у тебя ведать на пару с TheCalligrapher подрывает одно место, а жаль, я был о тебе лучшего мнения..
Вроде не я тут начал

0
3 / 3 / 1
Регистрация: 01.01.2020
Сообщений: 59
05.02.2022, 00:12
_lunar_, не могли бы вы подсказать, что же означает эта магическая последовательность?
C++
1
const TCHAR* StreamReName = TEXT(":wtfbbq");
Добавлено через 10 минут
P.S. вопрос отпал, это имя файла. Может быть рандомным, насколько я понимаю.
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
05.02.2022, 01:01
Demon13, да, все верно, это просто имя потока.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6163 / 2856 / 1042
Регистрация: 01.06.2021
Сообщений: 10,435
06.02.2022, 13:56
FROSTITAN, может в теории такое и возможно, но не задумывался ли ты о последствиях? Вы и не найдете ничего о таком удалении в официальной документации, т.к. такое действие порой может привести к нестабильной работе системы.
Как правило, лучше предупреждать пользователя, что удалению файла мешает такой-то процесс и дать пользователю выбор: закрыть этот процесс или отказаться от удаления файла, либо использовать MOVEFILE_DELAY_UNTIL_REBOOT или что-то в таком роде.
0
3 / 3 / 1
Регистрация: 01.01.2020
Сообщений: 59
06.02.2022, 22:11
После второго CreateFileW выдает ошибку, что файл не найден, что, собственно, логично т.к файл мы переименовали. У меня одного такая проблема?
0
 Аватар для Наталья8
520 / 370 / 66
Регистрация: 09.03.2016
Сообщений: 3,921
07.02.2022, 02:50
Удаляет... win7/64
0
3 / 3 / 1
Регистрация: 01.01.2020
Сообщений: 59
07.02.2022, 23:10
ассемблерная версия, вдруг, кому понадобится

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
format PE64 GUI
 
entry start
 
include 'C:\FASM\INCLUDE\WIN64AX.INC'
 
struct FILE_RENAME_INFO1
       ReplaceIfExists db 0
       db 3 dup (0)
       Flags dd 0
       RootDirectory dq 0
       FileNameLength dd 0
       FileName dw 0
       db 2 dup (0)
ends
 
struct FILE_RENAME_INFO
    union
        frename FILE_RENAME_INFO1
        buffer db 128 dup (0)
    ends
ends
 
section ".code" code writeable executable readable             
 
start:
 
        jmp rstart
skip:
        handle dq ?
        deletefile db ?
        buffer db 128 dup (0)
        newname du ":wtfbbq", 0
        fileinfo FILE_RENAME_INFO
 
 
rstart:
        sub rsp, 8
 
        fastcall GetModuleFileNameW, 0, buffer, 128
 
        fastcall CreateFileW, buffer, 0x00010000, 0, 0, 3, 0x80, 0
 
        mov [handle], rax
 
        mov eax, 8
        mov rbx, fileinfo
        mov [fileinfo.frename.FileNameLength], eax
        mov rsi, newname
 
        mov rcx, rax
        mov rdi, fileinfo.frename.FileName
 
        rep movsb
 
        fastcall SetFileInformationByHandle, [handle], 3, fileinfo, 128
        fastcall CloseHandle, [handle]
 
        fastcall CreateFileW, buffer, 0x00010000, 0, 0, 3, 0x80, 0
 
        mov [handle], rax
        mov [deletefile], 1
        fastcall SetFileInformationByHandle, [handle], 4, deletefile, 1
        fastcall CloseHandle, [handle]
 
 
 
 
 
 section '.idata' import data readable writeable
 
library kernel32, "kernel32.dll",
 
 
import kernel32,\
       SetFileInformationByHandle,'SetFileInformationByHandle',\
       GetModuleFileNameW,         'GetModuleFileNameW',\
       CloseHandle,                      'CloseHandle',\
       CreateFileW,                       'CreateFileW'
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
08.02.2022, 01:30
Demon13, спасибо, дело полезное, но не работает. Падает на GetModuleFileNameW.
0
3 / 3 / 1
Регистрация: 01.01.2020
Сообщений: 59
08.02.2022, 17:18
Исправленный рабочий вариант
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
format PE64 GUI
 
entry start
 
include 'C:\FASM\INCLUDE\WIN64AX.INC'
 
struct FILE_RENAME_INFO
  union
     ReplaceIfExist     dd  0
     Flags              dd  0
  ends
  ReplaceIfExists       dd  0
  RootDirectory         dq  0
  FileNameLength        dd  0
  FileName              rb  MAX_PATH
ends
 
 
 
section ".code" code writeable executable readable             
 
start:
 
        jmp rstart
skip:
        handle dq ?
        deletefile db ?
        buffer db 128 dup (0)
        newname du ":wtfbbq", 0
        fileinfo FILE_RENAME_INFO
 
 
rstart:
        sub rsp, 8
 
        invoke GetModuleFileNameW, 0, buffer, 128
 
        invoke CreateFileW, buffer, 0x00010000, 0, 0, 3, 0x80, 0
 
        mov [handle], rax
 
        mov eax, 8
        mov rbx, fileinfo
        mov [fileinfo.FileNameLength], eax
        mov rsi, newname
 
        mov rcx, rax
        mov rdi, fileinfo.FileName
 
        rep movsb
 
        invoke SetFileInformationByHandle, [handle], 3, fileinfo, 128
        invoke CloseHandle, [handle]
 
        invoke CreateFileW, buffer, 0x00010000, 0, 0, 3, 0x80, 0
 
        mov [handle], rax
        mov [deletefile], 1
        invoke SetFileInformationByHandle, [handle], 4, deletefile, 1
        invoke CloseHandle, [handle]
 
 
 
 
 
 section '.idata' import data readable writeable
 
library kernel32, "kernel32.dll"
 
 
import kernel32,\
       SetFileInformationByHandle,'SetFileInformationByHandle',\
       GetModuleFileNameW,         'GetModuleFileNameW',\
       CloseHandle,                      'CloseHandle',\
       CreateFileW,                       'CreateFileW'
P.S импортил через свою функцию и забыл сменить fastcall на invoke
P.P.S заменил на всякий случай структуру, как один уважаемый человек посоветовал здесь https://www.cyberforum.ru/fasm... st16055308
0
фрилансер
 Аватар для Алексей1153
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,049
25.06.2022, 00:39
_lunar_, спасибо за пример с SetFileInformationByHandle, заюзал себе с переделками )
Мне как раз потребовалось обновлять экзешник из сети, а для этого он сам себя должен заменить.

в коде есть UB
замечу, что в коде есть UB с разрушением стека (чудесный дизайн от авторов WinAPI рвёт мозг ) :

экземпляр структуры FILE_RENAME_INFO содержит всего один первый символ типа wchar_t (кстати, в коде почему-то char - это тоже косячок), остальные символы пути должны лежать сразу за телом структуры. Чтобы такого добиться, требуется разместить тело структуры и путь в массиве нужного размера. Указатель на начало массива и размер массива уже и передавать в SetFileInformationByHandle
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2022, 00:39
Помогаю со студенческими работами здесь

Как удалить файл, занятый другим процессом?
При работе 1С в каталоге пользоателя создается файл 1Cv7.LCK. При сбое этот файл остается занятым (стандартными средствами не удаляется)....

StreamReader и открытый (другим процессом) файл
Делаю программу, которая каждую секунду заглядывает в файл console.log, который использует игра. Код крашится, когда игра запущена, хоть и...

StreamReader не может открыть файл, открытый на запись другим процессом
Сабж. Как обойти? :help:

Как открыть файл для чтения, уже открытый другим процессом
Допустим, есть файл "debug.log", открытый процессом такой-то игры. мне надо его открыть для чтения строк вот код как я это делаю...

Удалить файл, который блокирован другим процессом
Работаю со сканером, через WIA, по нажатию кнопки происходит сканирование изображение private void Scan_Click(object sender,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru