У меня главный поток приложения по нажатию кнопки сначала создает файл для отправки в темповом каталоге, а затем перебрасывае его в общий выходной каталог. И так сразу для нескольких файлов.
Еще есть служебный поток (порожденный от TThread), который через функцию TThread::Synchronize и цикл FindFirstFile/FindNextFile выбирает их оттуда и обрабатывает. Так вот он не всегда цепляет файлы в той последовательности, в которой их подсовывает главный поток. Это заметно когда файлов много и идут они быстро один за другим. Если отправлять файлы по одному, то все нормально.
Кстати я еще замечал интересную фишку. Если в дебаге отлаживаеть цикл FindFirstFile/FindNextFile и в какой-то момент приостановив прогу, выйдти в Far и грохнуть все выбираемые файлы этого каталога, то при возвращении в дебуг в цикле будут цепляться несуществующие файлы!
Это я заметил довольно давно.
Может перед циклом FindFirst/FindNext или где-то внутри него как-то рефрешить информацию о перебираемых файлах, ведь не зря же есть ф-ия SHChangeNotify, которая уведомляет систему об изменениях в файловой системе.
Кто-нибудь знает, как вообще перебирает файлы цикл FindFirstFile/FindNextFile, т.е. в какой последовательности ?
Мне видится,что проблема в следующем. Есть общий каталог, куда кто-то пишет и кто-то читает, так вот порядок записи должен совпадать с порядком считывания.
Как нужно формировать файлы в общем каталоге, чтобы они потом считывались в порядке создания ? И как считывать их правильно ?
У меня сейчас сделано так. Главный поток создает файл в темповом каталоге, затем в общем каталоге создается файл по CreateFile с эксклюзиывным доступом, куда переписывается информация из темпового файла и делается CloseHandle.
Поток выборки использует цикл FindFirstFile/FindNextFile, в котором для каждого найденного файла проверяет эксклюзивный доступ к нему. Если доступа нет — FindClose и цикл начинается сначала.