Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/22: Рейтинг темы: голосов - 22, средняя оценка - 5.00
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
1

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

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

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

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

Добавлено через 21 минуту
Пока что пришла идея использовать ReadDirectoryChangesW для отслеживания создания файлов + по таймеру проверять , занят ли этот файл, с помощью
C++
1
MoveFile(FilePath, FilePath)
Пробую это в класс обернуть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 09:29
Ответы с готовыми решениями:

Отслеживание изменений файлов на компьютере
Здравствуйте. Прошу помощи, задача написать программу отката, т.е. как функция...

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

Поиск и Сравнение файлов по дате создания
Доброго времени суток, прошу совет. Задача такова, нужно найти файлы с...

Управление чужим окном
Прошу помочь... Мне нужно взять текст из ЧужоеОкно->Memo задать текст я...

Взаимодействие с чужим приложением
Здравствуйте господа. Нужна ваша помощь по таким вопросам: 1. из своей...

24
LK
Заблокирован
22.03.2013, 17:08 2
Все украдено до нас...
http://www.cyberguru.ru/cpp-sources/...-na-diske.html
0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
22.03.2013, 18:09  [ТС] 3
Цитата Сообщение от LK Посмотреть сообщение
Все украдено до нас... http://www.cyberguru.ru/cpp-sources/...-na-diske.html
Эта функция никак мне не поможет. Она только проверяет на существование файла, на возможность чтения и записи в файл. На занятость файла не умеет проверять. В первом посте указал, что это может сделать функция MoveFile, но и этого мало. Это только малая часть решения задачи.
0
LK
Заблокирован
22.03.2013, 18:33 4
Функция
_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
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
22.03.2013, 18:44  [ТС] 5
LK Чем она(функция) поможет в решении задачи?
0
LK
Заблокирован
22.03.2013, 18:51 6
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Мне нужно отследить создание нового файла в папке и последующее его освобождение чужим процессом.
- ... -
Цитата Сообщение от LK Посмотреть сообщение
Если файл уже открыт другим процессом с любым параметром, то функция вернёт ошибку.

Не по теме:

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

0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
22.03.2013, 19:15  [ТС] 7
Вот пример, сообщение об ошибке не появляется:
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
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
22.03.2013, 19:47 8
Что означает "освобождение файлов"?
0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
22.03.2013, 19:52  [ТС] 9
Цитата Сообщение от Avazart Посмотреть сообщение
Что означает "освобождение файла"?
Это когда файл перестает быть открытым другими процессами.
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
22.03.2013, 20:06 10
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Это когда файл перестает быть открытым другими процессами.
Ну так а суть ?

Используй к примеру ofstrem поток для проверки ...
Только вот не все программы блокируют файл при открытии..
0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
22.03.2013, 20:23  [ТС] 11
Цитата Сообщение от Avazart Посмотреть сообщение
Используй к примеру ofstrem поток для проверки ...
Только вот не все программы блокируют файл при открытии..
Мне не на блокировку нужно проверять, а именно, открыт ли файл в других процессах.
Чужой процесс же может открыть файл в режиме раздельного использования, и как мне в этом случае знать, что он закончил в него что-то записывать.
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
22.03.2013, 21:28 12
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Мне не на блокировку нужно проверять, а именно, открыт ли файл в других процессах.
Чужой процесс же может открыть файл в режиме раздельного использования, и как мне в этом случае знать, что он закончил в него что-то записывать.
Если процесс пишет в файл, то он явно занимает его, иначе файл просто может его храниться в памяти процесса...
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26148 / 17525 / 6950
Регистрация: 22.10.2011
Сообщений: 30,861
Записей в блоге: 6
22.03.2013, 22:12 13
kzru_hunter, а что передается последним параметром в ReadDirectoryChangesW, можно узнать? И зачем это вообще ввели в WinAPI, интересно...
0
Ddv122
Почемучка)
1240 / 300 / 30
Регистрация: 23.12.2010
Сообщений: 1,998
Записей в блоге: 1
26.03.2013, 00:13 14
kzru_hunter, не вышло?

Не по теме:

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

0
LK
26.03.2013, 00:26
  #15

Не по теме:

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

1
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
26.03.2013, 00:41 16
Если не ошибаюсь, то мониторинг каталога на флешке не срабатывает...
1
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
26.03.2013, 09:18  [ТС] 17
Цитата Сообщение от Avazart Посмотреть сообщение
Если не ошибаюсь, то мониторинг каталога на флешке не срабатывает...
Ошибаешься, срабатывает. Может отслеживать любые изменения на всей флешке.

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

Цитата Сообщение от Ddv122 Посмотреть сообщение
Если я смогу узнать что создает autorun.inf на флэшке (имя процесса (вируса) всегда разное)
ReadDirectoryChangesW возвращает только относительный путь файла, с которым произошли изменения, и название события (удален, изменен, создан). Поэтому если вирус следал какие-то изменения в этом файле и сразу же закрыл этот файл, то маловероятно, что после того, как ReadDirectoryChangesW отловит какое-либо событие, можно успеть получить имя процесса, открывшего этот файл.
Именно перехват вызовов API функции CreateFile может спасти в этой ситуации (но в добавок появляется много других проблем).
2
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
26.03.2013, 15:42 18
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Ошибаешься, срабатывает. Может отслеживать любые изменения на всей флешке.
Проверено ?
0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
29.03.2013, 15:30  [ТС] 19
Надоело уже возиться с этим 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
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,411
Записей в блоге: 17
29.03.2013, 17:12 20
Как бы наверное можно спросить у -=ЮрА=-, Мониторинг реестра, каталогов, списка процессов
0
29.03.2013, 17:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 17:12

Запомнить значение без создания текстовых и конфигурационных файлов и реестра
Здравствуйте! Подскажите, пожалуйста, есть ли в Embarcadero RAD Studio 2010...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru