![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Unconnected |
![]()
Сообщение
#1
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Привет всем.
Допустим, есть файл или папка, путь и имя известны. Нужно отловить событие переименования этого файла или папки и получить новое имя. Такое возможно? -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Можно. С помощью функции MSDN -> ReadDirectoryChangesW, например.
Вот тут есть пример использования. Но он не совсем корректен, потому что вот так ![]() |
Unconnected |
![]()
Сообщение
#3
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Я немного изменил процедуру (убрал ненужные фильтры), получилось так:
type , оставил те, которые не знаю, зачем нужны) В процедуру передаю путь к папке, имя которой надо мониторить. Кстати, в msdn написано: The function does not report changes to the specified directory itself. Это случаем не значит, что программа не будет смотреть изменения папки, в которой сама находится? (да, знаю, что в большинстве случаев переименовать папку с работающей программой внутри не получится). Так вот, запускаю её единожды - программа виснет. В таймере если запускать, тоже виснет. Как надо? Добавлено через 15 мин. Цитата Это случаем не значит, что программа не будет смотреть изменения папки, в которой сама находится? Даа, кажется именно это и значит.. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Так вот, запускаю её единожды - программа виснет Что значит "виснет"? У тебя синхронный вызов, пока событие, которое программа должна отловить, не произойдет, программа дальше не двинется. Сделай асинхронный - не будет зависать. В MSDN написано, что надо для этого сделать... |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Пример использования ReadDirectoryChangesW в отдельном потоке:
Прикрепленные файлы ![]() |
Unconnected |
![]()
Сообщение
#6
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
У меня D2007 этот проект не открыла, говорит, там файла какого-то не хватает. Я аккуратно перенёс всё в новый проект, вписал нужный путь (такой файл существует), при нажатии "Начать" ошибка "файл не найден" не выдаётся, но и слежения, как я понял, не происходит (в Memo не появляются записи о переименовании, удалении и т.п.). Прикладываю на всякий случай мой проект, хотя там всё то же самое.
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата говорит, там файла какого-то не хватает Какого именно, можешь уточнить? Я делал под D2009, там работает. Твой код тоже отрабатывает:![]() Добавлено через 2 мин. P.S. Какая ОС, уточни, кстати. Может это опять Вистовские заморочки? И еще одно: что у тебя возвращает ReadDirectoryChangesW? Если False, то проверь причину: if not ReadDirectoryChangesW(hDir, lpBuf, BUFFER, true, Filter, @cbReturn, nil, nil) then |
Unconnected |
![]()
Сообщение
#8
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
У меня Windows 7 Home Basic. Пробовал запускать свой проект на виртуалке с XP - при нажатии кнопки Начать выпрыгивает ошибка Windows (Отправить отчёт\не отправлять). Если открываю твой проект, то "Unable to load project C:\Users\Unconnected\Desktop\Spy Dir\Project1.dproj".
А ReadDirectoryChangeW возвращает False и выдаёт Error "Параметр задан неверно". На Севене я не под администратором сижу, запись в корень диска C: запрещена, например. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата На Севене я не под администратором сижу, запись в корень диска C: запрещена, например. Так я и под XP не под администратором, если что, запись в корень диска у меня тоже запрещена, я ж в корень-то и не пишу, я в подпапку, а туда уже можно... Сейчас гляну, что там может вызывать такую ошибку. |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
|
Unconnected |
![]()
Сообщение
#11
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Фигня какая-то.. И как я его уже только не пробовал) Volvo, а ты не мог бы ради интереса приложить скомпилированный exe, который у тебя работает? (да-да, я понимаю риск...
![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Ну, понимаешь - тогда пробуй:
Прикрепленные файлы ![]() |
Unconnected |
![]()
Сообщение
#13
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Создал C:\1\555_21.png - работает.. Наверное, руки не оттуда мои, попробую со средой поколдовать. Спасибо за код
![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Unconnected |
![]()
Сообщение
#14
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Поставил D2009, скомпилировал начальные исходники volvo - такая же фигня, только почему-то когда в CheckPath пишешь путь к папке - говорит про неверный параметр, а когда к файлу - не говорит ничего, но и не следит. Ладно, чёрт с ним, наверное, у меня в системе что-то наворочено. А можно тогда просто запретить переименование файла? Мне кажется, в сторону SetWindowsHookEx смотреть надо, там вроде любое действие отловить можно.
Добавлено через 17 мин. И сам нагуглил-додумался ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
![]() ![]() |
![]() |
Текстовая версия | 10.07.2025 21:07 |