0

我有一个算法

1.扫描一个目录中的所有文件(使用C完成)

2.在循环中获取当前文件的文件大小(使用C完成)

3.如果小于 8 kb 做一些事情并将下一个立即文件名存储在一个数组中(好像 C 中不支持关联数组)

我已经在 PHP 中完成了这项工作,但由于不可预见的事件,它现在需要用 C 编写。我确实阅读了很多关于 C 的教程,老实说,我低估了我认为自己需要的时间来获得基础知识。

经过相当长的一段时间后,我设法获得了列出目录中文件的代码。

#include <dirent.h> 
#include <stdio.h>
#include <conio.h>

int main(void)
{ 
  char path = "D:\\ffmpeg\\bin\\frames\\"; 
  DIR           *d;
  struct dirent *dir;
  char test;
  d = opendir("D:\\ffmpeg\\bin\\frames\\");
  if (d)
  {
    while ((dir = readdir(d)) != NULL)
    {      
       printf("%s\n", dir->d_name);
    }

    closedir(d);
  }
  getchar();
  return(0);
}

现在很明显循环中的当前文件由dir->d_name. 我被困的事情是把它附加到上面,"D:\\ffmpeg\\bin\\frames\\"这样路径就变成了"D:\\ffmpeg\\bin\\frames\\somename.jpg"

这将帮助我获取文件的直接路径。一旦我知道了,我将拥有移动到第 2 步所需的数据。我现在面临的问题是字符串连接。我试过strcat()了,但没有成功。

所以基本上我正在寻找的是

while ((dir = readdir(d)) != NULL)
{      
   // merge "path" and "dir->d_name" to get something similar like
   // "D:\\ffmpeg\\bin\\frames\\somename.jpg"
}

任何帮助,建议?

4

2 回答 2

1

strcat()仅当您的字符串有足够的空间来保存结果时才有效,并且它将使目标对于后续通过您的循环无效。

我建议改为使用该asprintf()功能,尽管它有一个小警告;它将分配您负责返回的内存。

while ((dir = readdir(d)) != NULL)
{
   char *fullname;
   asprintf(&fullname, "%s%s", "D:\\ffmpeg\\bin\\frames\\", dir->d_name);
   printf("%s\n", fullname);

   // now do things with `fullname`

   free(fullname); // return the memory allocation at the end of the loop
}
于 2013-02-14T12:23:03.330 回答
1

普通 C 中的推荐解决方案是snprintf

char buf[MAX_PATH];
snprintf(buf, sizeof(buf), "%s%s", path, dir->d_name);

不要使用strcat()strncat()

如果您使用的是 MSVC,那么您的 C 实现已经过时 24 年,并且snprintf()不可用。您的选择是:

  1. 使用_snprintf()然后buf[sizeof(buf)-1] = '\0';作为解决方法。

  2. 使用 C++ 和std::string.

  3. 使用 Cygwin。

于 2013-02-14T12:23:41.897 回答