在一个目录中保存多个文件名(win32 c++)

Saving multiple file names in a directory(win32 c++)

本文关键字:文件名 win32 c++ 保存 一个      更新时间:2023-10-16

我想在同一目录下保存多个文件名。然而,它似乎只保存数组中的最后一个文件。下面是我的代码:

hFind = FindFirstFile("*.bin", &FindFileData);
if(hFind == INVALID_HANDLE_VALUE) {
  printf("Not founded");
}
 else {
  printf("Found: %s", FindFileData.cFileName);
}
 if(hFind != INVALID_HANDLE_VALUE) {
do
 {
  if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  {
    printf("nFound: %sn", FindFileData.cFileName);
  }
  else
  {
     filesize.LowPart = FindFileData.nFileSizeLow;
     filesize.HighPart = FindFileData.nFileSizeHigh;
     count++;
     filesize.QuadPart += filesize.QuadPart;
     printf("%s %ld bytes", FindFileData.cFileName, filesize.QuadPart);
     printf("count number:%sn", FindFileData.cFileName);
     files[count] = FindFileData.cFileName;
     printf("nfiles array:%s", files[count]);
  }
}
 while (FindNextFile(hFind, &FindFileData) != 0);
 //when I'm printing the file[3], it is showing the last file
printf("file in 3:%s", files[3]);

问题是整个数组只被最后一个文件填满。每次转到下一个文件时,整个数组都会被最后一个文件替换。我不知道这是win32的问题还是别的什么。需要你的见解。提前感谢!

问题在这一行:

files[count] = FindFileData.cFileName;

它复制FindFileData的地址。cFileName变成文件[count]。由于地址总是相同的,所以files数组中的所有数组项将始终包含相同的值。

必须复制整个字符串,而不仅仅是一个指针。将files变量声明为:

字符文件[MAC_FILE_COUNT] [MAX_PATH];

然后替换"files[count] = FindFileData"行。cFileName":

拷贝字符串(文件[数],FindFileData.cFileName);

这一行

files[count] = FindFileData.cFileName;

不复制字符串,它只是复制一个地址。这是一个指针赋值。所以files[]中的每个元素都指向同一个内存块,字符数组FindFileData.cFileName。因此,自然地,复制到FindFileData.cFileName的最后一个值就是您在files[]中看到的所有索引的值。

如果你想复制字符串,你需要使用strcmp。你几乎肯定没有为files[]中的char*指针分配任何内存,所以你也需要这样做。使用malloc()strlen()

然而,由于您将此标记为c++,我将放弃使用原始数组,C字符串等,并切换到c++标准容器。在这种情况下,您似乎想要vector<string>

像这样声明容器:

vector<string> files;

然后添加如下内容:

files.push_back(FindFileData.cFileName);

然后像这样遍历容器:

for(vector<string>::iterator it = files.begin(); it != files.end(); ++it) {
    // do something with *it
}