С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1

Отслеживание создания файлов чужим процессом

22.03.2013, 09:29. Показов 7307. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возникла проблемка с отслеживанием создания новых файлов в определенной папке чужим процессом (видео-проигрыватель). Этот процесс до действию пользователя создаёт картинки в определенной папке. Мне нужно отследить создание нового файла в папке и последующее его освобождение чужим процессом. Как бы это сделать более производительно и стабильно?

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

Добавлено через 21 минуту
Пока что пришла идея использовать ReadDirectoryChangesW для отслеживания создания файлов + по таймеру проверять , занят ли этот файл, с помощью
C++
1
MoveFile(FilePath, FilePath)
Пробую это в класс обернуть.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2013, 09:29
Ответы с готовыми решениями:

Отслеживание создания/изменения файлов на накопителях (cd/usb)
День добрый, имеется одна проблемка с потоками. Необходимо создать софт, позволяющий отслеживать создание/изменение файлов на...

Отслеживание закрытия файла процессом, запущенным через CreateProcess
Доброго времени суток! Возникла нетривиальная(на мой взгляд) задачка: Открываем какой нибудь файл через какую нибудь программу(условно...

Подхват файлов процессом
Задача: Написать приложение, которое делает захват(лок) файла. Пока файл захвачен, его нельзя удалять, переименовывать, перемещать....

24
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.03.2013, 17:08
Все украдено до нас...
http://www.cyberguru.ru/cpp-so... diske.html
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.03.2013, 18:09  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Все украдено до нас... http://www.cyberguru.ru/cpp-so... diske.html
Эта функция никак мне не поможет. Она только проверяет на существование файла, на возможность чтения и записи в файл. На занятость файла не умеет проверять. В первом посте указал, что это может сделать функция MoveFile, но и этого мало. Это только малая часть решения задачи.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.03.2013, 18:33
Функция
_lopen

Эта функция открывает существующий файл и устанавливает позицию чтения в самое начало. Функция устарела и вместо неё желательно использовать CreateFile.

Существует в: Win16, Win32, Win NT

Для С/С++ объявлена в winbase.h.
C++
1
2
3
4
HFILE _lopen(
  LPCSTR lpPathName, // Указатель на строку с именем файла
  int iReadWrite     // Тип доступа
);
Тип доступа может быть:

OF_READ - для чтения
OF_WRITE - для записи
OF_READWRITE - для чтения и записи

Если открыть файл с разделяемым доступом, т.е. несколько пользователей смогут открывать один и тот же файл одновременно, то этот параметр сможет принимать значения:

OF_SHARE_COMPAT - Открыть файл в разделяемом режиме. В этом случае любые процессы на компьютере смогут тоже открывать этот файл.
OF_SHARE_DENY_NONE - Открыть файл без запрещения доступа для других процессов. Если файл уже открыт другим процессом с параметром OF_SHARE_COMPAT, то функция вернёт ошибку.
OF_SHARE_DENY_READ - Открыть файл с запретом доступа для других процессов на чтение. Если файл уже открыт другим процессом с параметром OF_SHARE_COMPAT, то функция вернёт ошибку.
OF_SHARE_DENY_WRITE - Открыть файл с запретом доступа для других процессов на запись. Если файл уже открыт другим процессом с параметром OF_SHARE_COMPAT, то функция вернёт ошибку.
OF_SHARE_DENY_WRITE - Открыть файл с запретом доступа для других процессов на чтение и запись. Если файл уже открыт другим процессом с любым параметром, то функция вернёт ошибку.

Если функция выполнена успешно, то она возвращает указатель на открытый файл. Если произошла ошибка, то функция вернёт HFILE_ERROR. Для получения более полной информации о происшедшей ошибке нужно вызвать функцию GetLastError (вернуть последнюю ошибку).

Пример:
C++
1
_lopen('c:\\filename', OF_READWRITE);
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.03.2013, 18:44  [ТС]
LK Чем она(функция) поможет в решении задачи?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.03.2013, 18:51
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Мне нужно отследить создание нового файла в папке и последующее его освобождение чужим процессом.
- ... -
Цитата Сообщение от LK Посмотреть сообщение
Если файл уже открыт другим процессом с любым параметром, то функция вернёт ошибку.

Не по теме:

хотя... зачем я в это встрял :scratch:

0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.03.2013, 19:15  [ТС]
Вот пример, сообщение об ошибке не появляется:
C++
1
2
3
4
        TFileStream *fs = new TFileStream("C:\\1.txt", fmShareDenyNone);
 
        HFILE hFile = _lopen("C:\\1.txt", OF_SHARE_DENY_NONE);
        if (hFile == HFILE_ERROR) ShowMessage("error");
Но не в этом суть. Видимо я не понятно объяснил суть задачи.
Объясню снова:
1) Есть папка, например "C:\Folder"
2) Есть моя программа
3) Нужно сделать класс, который бы каждый раз при появлении в этой папке (C:\Folder) нового файла генерировал событие с указанием пути к этому файлу, т.е. этот класс должен следить за этой папкой. Причем моё приложение не знает, какой файл может в этой папке появится. Также это событие должно происходить не сразу при появлении файла, а после того, как чужой процесс перестанет с ним работать, т.е. закроет дескриптор файла. Эту задачу нужно решить так, чтобы было меньше воздействий на винчестер и при этом событие практически сразу генерировалось при завершении работы с файлом.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.03.2013, 19:47
Что означает "освобождение файлов"?
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.03.2013, 19:52  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Что означает "освобождение файла"?
Это когда файл перестает быть открытым другими процессами.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.03.2013, 20:06
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Это когда файл перестает быть открытым другими процессами.
Ну так а суть ?

Используй к примеру ofstrem поток для проверки ...
Только вот не все программы блокируют файл при открытии..
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.03.2013, 20:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Используй к примеру ofstrem поток для проверки ...
Только вот не все программы блокируют файл при открытии..
Мне не на блокировку нужно проверять, а именно, открыт ли файл в других процессах.
Чужой процесс же может открыть файл в режиме раздельного использования, и как мне в этом случае знать, что он закончил в него что-то записывать.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.03.2013, 21:28
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Мне не на блокировку нужно проверять, а именно, открыт ли файл в других процессах.
Чужой процесс же может открыть файл в режиме раздельного использования, и как мне в этом случае знать, что он закончил в него что-то записывать.
Если процесс пишет в файл, то он явно занимает его, иначе файл просто может его храниться в памяти процесса...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
22.03.2013, 22:12
kzru_hunter, а что передается последним параметром в ReadDirectoryChangesW, можно узнать? И зачем это вообще ввели в WinAPI, интересно...
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
26.03.2013, 00:13
kzru_hunter, не вышло?

Не по теме:

то для моего FlashCleaner вообще вещь хорошая была бы
Если я смогу узнать что создает autorun.inf на флэшке (имя процесса (вируса) всегда разное) я могу удалить этот файл - и убрать корень вируса

0
26.03.2013, 00:26

Не по теме:

Цитата Сообщение от Ddv122 Посмотреть сообщение
Если я смогу узнать что создает autorun.inf
Перехват вызовов API-функций

1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.03.2013, 00:41
Если не ошибаюсь, то мониторинг каталога на флешке не срабатывает...
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
26.03.2013, 09:18  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Если не ошибаюсь, то мониторинг каталога на флешке не срабатывает...
Ошибаешься, срабатывает. Может отслеживать любые изменения на всей флешке.

Цитата Сообщение от Ddv122 Посмотреть сообщение
не вышло?
До ума еще не довел, недочеты пытаюсь исправить

Цитата Сообщение от Ddv122 Посмотреть сообщение
Если я смогу узнать что создает autorun.inf на флэшке (имя процесса (вируса) всегда разное)
ReadDirectoryChangesW возвращает только относительный путь файла, с которым произошли изменения, и название события (удален, изменен, создан). Поэтому если вирус следал какие-то изменения в этом файле и сразу же закрыл этот файл, то маловероятно, что после того, как ReadDirectoryChangesW отловит какое-либо событие, можно успеть получить имя процесса, открывшего этот файл.
Именно перехват вызовов API функции CreateFile может спасти в этой ситуации (но в добавок появляется много других проблем).
2
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.03.2013, 15:42
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Ошибаешься, срабатывает. Может отслеживать любые изменения на всей флешке.
Проверено ?
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
29.03.2013, 15:30  [ТС]
Надоело уже возиться с этим ReadDirectoryChangesW, уже все закомментил и убрал лишнее, но все равно осталась проблема с пропаданием событий (при удалении 3000 пустых файлов; должно прийти 3000 событий, а приходит на 1-50 событий меньше).

Вообщем, вот код в упрощенном варианте. Может кто знает, где в нем ошибка?
(Если нужно узнать значение переменной bytes - поставьте breakpoint)
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
        HANDLE hFolder = CreateFile("C:\\Dir",
                                        FILE_LIST_DIRECTORY, // dwDesiredAccess
                                        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // dwShareMode
                                        NULL, // lpSecurityAttributes
                                        OPEN_EXISTING, // dwCreationDisposition
                                        FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, // dwFlagsAndAttributes
                                        NULL); // hTemplateFile
 
        if (hFolder == INVALID_HANDLE_VALUE)
        {
                ShowMessage("error");
                return;
        }
 
        byte *data = new byte[4096];
 
        OVERLAPPED ol; ol.hEvent = CreateEvent(NULL, false, false, NULL);
 
        DWORD bytes = 0;
 
        while (true)
        {
                ReadDirectoryChangesW(hFolder, data, 4096, false, FILE_NOTIFY_CHANGE_FILE_NAME, NULL, &ol, NULL);
 
                if ( WaitForSingleObject(ol.hEvent, 100) != WAIT_OBJECT_0) continue;
 
                DWORD dw = 0;
                if ( GetOverlappedResult(hFolder, &ol, &dw, false) )
                {
                        bytes += dw;
                }
        }
Тут я проверяю по кол-ву байтов, а не по кол-ву событий, т.к. так проще. У всех файлов длина из 12 символов (включая расширение), поэтому на каждый файл приходит 36 байт (12*2 + 12(структура)).
По поводу кода: если убрать WaitForSingleObject и в GetOverlappedResult заменить последний параметр на true, то проблема исчезает и приходит как раз точь в точь 36*3000 = 108000 байт.
Из-за чего такое происходит?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.03.2013, 17:12
Как бы наверное можно спросить у -=ЮрА=-, Мониторинг реестра, каталогов, списка процессов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2013, 17:12
Помогаю со студенческими работами здесь

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

Отслеживание Создания Объектов При Обмене По Правилам.
Есть обмен между двумя ИБ по правилам. Иногда некоторый справочник задваивается. Есть ли предложения как можно фиксировать при...

Удаление файлов, занятых процессом
Бонжур. Есть какой-нибудь способ удалить файл, используемой самой программой? Допустим у меня есть админка для редактирования,...

Получить имена файлов, используемых процессом
есть некий процесс, он читает некие файлы, хочу получить имена этих файлов в дотнете есть хоть что-то для этого дела? может кто...

Как реализовать загрузчик файлов с сервера с процессом загрузки
Есть ли приеры, как реализовать загрузчик файлов с сервера с процессом загрузки? Что не находил, все не то.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru