Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.225.149.136] |
|
Сообщ.
#1
,
|
|
|
Мне нужно мониторить изменения в каталогах, для этого прекрасно подходит функция ReadDirectoryChangesW . В отдельных тестовых проектах все работает, а добавляю в свой проект - и получаю странное поведение соответствующих функций.
Ошибки происходят такие: - при добавлении файлов/каталогов в каталог, получаю одно срабатывание с правильным именем нового файла, на следующее срабатываение получаю пустую строку в Filename, далее ничего не происходит, хотя остается много необработанных новых файлов. - при переименовании, часто в OldFilename получаю старое имя файла плюс мусор (типа 'OldFilenameX', где никакого X быть не должно). Пробовал разные примеры, например Мониторинг изменений на диске , также юзал компонент с торри, все одно. Может кто сталкивался с таким поведением, почему так может быть? уже несколько дней бьюсь.. |
Сообщ.
#2
,
|
|
|
Как же тебе можно без кода-то помочь?
|
Сообщ.
#3
,
|
|
|
Цитата shershen @ Пробовал разные примеры, например Мониторинг изменений на диске , также юзал компонент с торри, все одно. Может кто сталкивался с таким поведением, почему так может быть? уже несколько дней бьюсь.. Вместо того, чтобы "биться" нужно внимательно глянуть в msdn, где черным по белому сказано, что строка FileName is not null-terminated, поэтому оба приведенных по ссылке примера некорректны и работают правильно только в случае, когда сразу за FileName идет выравнивающий нулевой ворд, иначе в конце строки может добавляться мусор. По правильному для преобразования FileName в анси-строку нужно юзать WideCharLenToStrVar(Info.FileName,Info.FileNameLength,s); //явное преобразование или SetString(s,Info.FileName,Info.FileNameLength); //неявное с расчетом на сообразительность компилятора Поэтому в первом примере FileName вообще не правильно берется напрямую, а во втором NewFileName устанавливается правильно через SetString, а OldFileName - не правильно. Что касается кол-ва записей, то в первом примере читается только первая, остальные игнорируются. Во втором примере должны читаться все, но передвижка указателя на следующую запись сделана через PChar и соотв-но может работать неправильно в юникодовской версии дельфи 2009 - лучше делать через integer. |
Сообщ.
#4
,
|
|
|
Спасибо, leo, похоже, действительно в этом проблема!
|