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

时间:2013-04-15 01:44:44

标签: c++ file winapi

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

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: %s\n", 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:%s\n", 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问题还是别的什么。需要你的见解。提前谢谢!

2 个答案:

答案 0 :(得分:0)

这一行

files[count] = FindFileData.cFileName;

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

如果要复制字符串,则需要使用strcmp。你几乎肯定不会为char*中的files[]指针分配任何内存,所以你也需要这样做。使用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
}

答案 1 :(得分:0)

问题在于这一行:

files [count] = FindFileData.cFileName;

它将FindFileData.cFileName的地址复制到文件[count]中。由于地址始终相同,因此files数组中的所有数组项将始终包含相同的值。

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

char文件[MAC_FILE_COUNT] [MAX_PATH];

然后用“

”替换“files [count] = FindFileData.cFileName”行

strcpy(files [count],FindFileData.cFileName);