FindFirstFile和FindNextFile问题

时间:2009-08-26 17:48:12

标签: c++ c visual-studio winapi

输出:

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);
      }

    }

“print”这个词实际上在我的printf中缩短了。有时它显示所有文件名有时会显示一些,有时它甚至没有完成printf引用行,如上所示。造成这种情况的原因是什么?我被printf功能误导了?在调试器中,它看起来一切正常,但我想确定并理解这一点。例如,我在文件中没有空字符?为什么要在这里切断?谢谢。

编辑: 不正确 - 单线程应用程序库。 (以前是多线程的,对不起)

打印到文件时会提供完整的文件列表,而printf会同时“不稳定”。我不确定为什么......

2 个答案:

答案 0 :(得分:2)

既然你说你的程序是多线程的,我猜这个函数正在执行的线程正在被提前杀死。在调试器下运行时不会发生这种情况。您需要一些线程同步以确保允许此线程完成。

答案 1 :(得分:1)

由于您的应用程序是多线程的,因此printf可能会被另一个线程中途缩短,然后由另一个线程获得控制权,请尝试:

  1. 在所有printf()调用之后,使用fflush(stdout);来确保刷新缓冲区。
  2. 如果这不能解决问题,您可以使用名为mutexcritical section的stdout资源进行保护。基本上用Wait替换所有printf + fflush调用,然后在命名互斥锁上包含一个Signal。
  3. (不确定是否需要第2步)。