【问题标题】:FindFirstFile and FindNextFile questionFindFirstFile 和 FindNextFile 问题
【发布时间】:2009-08-26 17:48:12
【问题描述】:

输出:

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 功能误导了?在调试器中看起来一切正常,但我想确定并理解这一点。例如,我在文件中没有空字符,对吗?为什么这里会被截断?谢谢。

编辑: 不正确 - 单线程应用程序库。 (之前是多线程的,不好意思)

打印到文件会给出完整的文件列表,而 printf 同时是“不稳定的”。不知道我明白为什么....

【问题讨论】:

  • 你的程序是否运行多个线程?
  • @Luke:是的,需要修改吗? @fbrereton:不知道是怎么出来的,但它在我的代码中。
  • 调试模式下的单线程...比较困惑。
  • 为什么要在输出中嵌入 HTML 标签?如果这是通过浏览器进行的,我会查看浏览器和/或连接问题。
  • 您正在使用 printf 和 %s... 它不是将 FindFileData.cFileName 视为非 unicode 字符串吗?我希望只在输出中写入第一个字符... :) 因为我只是尝试运行它:)

标签: c++ c visual-studio winapi


【解决方案1】:

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

【讨论】:

  • 我相信它可能会发生,只是不太可能
【解决方案2】:

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

  1. 在所有 printf() 调用之后,使用 fflush(stdout);,以确保缓冲区被刷新。
  2. 如果这不能解决问题,您可以使用命名为 mutexcritical section 来保护标准输出资源。基本上用 Wait 包装所有 printf + fflush 调用,然后在命名互斥体上使用 Signal。

(不确定是否需要第 2 步)。

【讨论】:

  • 值得注意的是,stdout 在 windows 上不是行缓冲的。这意味着交错输出到标准输出的可能性要大得多。冲洗将是一个很好的做法,关键部分将是最简单的选择,最适合这个问题。
猜你喜欢
  • 2014-05-26
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多