2009-08-26 5 views
1

Выход:FindFirstFile и FindNextFile вопрос

The first file found is LOG_09.TXT 
Next file name is LOG_10.TXT 
Next file name is LOG_11.TXT 
Next fi       (cut off word "file"?) 

Функция:

//Find last modified log file 
    hFind = FindFirstFile("..\\..\\LOGS\\LOG*.TXT", &FindFileData); 
    if (hFind == INVALID_HANDLE_VALUE) 
    { 
     printf ("FindFirstFile failed (%d)\n", GetLastError()); 
     return; 
    } 
    else 
    { 
     printf("The first file found is %s<br>",FindFileData.cFileName); 

     //List all the other files in the directory. 
     while (FindNextFile(hFind, &FindFileData) != 0) 
     { 
     printf ("Next file name is %s<br>", FindFileData.cFileName); //NOT DISPLAYING ALL NAMES CONSISTENTLY?? 

     } 

     dwError = GetLastError(); 
     FindClose(hFind); 

     if (dwError != ERROR_NO_MORE_FILES) 
     { 
     printf ("FindNextFile error. Error is %u.\n", dwError); 
     return (-1); 
     } 

    } 

Слово "файл" на самом деле оборвалась в моем Printf. Иногда он отображает все имена файлов, иногда он отображает несколько, иногда он даже не заканчивает строку с кавычками printf, как показано выше. Что вызывает это, и меня вводят в заблуждение функциональностью printf? В отладчике все выглядит нормально, но я хочу быть уверенным и понять это. Например, у меня нет нулевого символа после того, как я в файле правильно? Почему это отрезано здесь? Благодарю.

EDIT:Неверный - Однопоточная библиотека приложений. (Было многопоточно, извините)

Печать в файл дает полный список файлов, в то время как printf одновременно является «неустойчивым». Не уверен, что я понимаю, почему ....

+0

Ваша программа работает под несколькими потоками? – luke

+0

@ Luke: Да, это так, нужно ли это изменить? @fbrereton: Не знаю, как это получилось, но это в моем коде. –

+0

одиночная резьба в режиме отладки ... более путать. –

ответ

1

Поскольку ваше приложение многопоточное, то Printf может получить оборвать половину пути через, другой поток, который затем получает контроль, попробуйте следующее:

  1. После всех Е (), используйте fflush (stdout) ;, чтобы убедиться, что буфер сброшен.
  2. Если это не исправить, вы можете защитить ресурс stdout с именем mutex или critical section. В основном оберните все вызовы printf + fflush с помощью Wait, а затем Signal на названном мьютексе.

(Не уверен, что потребуется этап 2).

+1

Стоит отметить, что stdout не зацикливается на окнах. это означает, что вероятность чередующегося вывода в stdout намного больше. промывка будет хорошей практикой, и критический раздел будет самым простым выбором и наилучшим образом подходит для этой проблемы. –

2

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

+0

Я считаю, что это может произойти, это менее вероятно –