C++-将文件复制到所有子目录

C++ - Copying a file to all sub directories

本文关键字:子目录 复制 文件 C++-      更新时间:2023-10-16

我正试图创建一个用于教育目的的程序,该程序应该能够将.exe的同一目录中的一个文件(任何扩展名,文件名永远不会更改)复制到主目录中的所有目录中。例如,我有:

  • 主目录
  • Program.exe
  • 文件测量
  • 目录1
  • 目录2
  • 目录3

在这种情况下,程序应该将file.something复制到目录1、2和3中。通过使用此代码,我可以访问.exe文件夹的绝对路径:

char basePath[255]="";
_fullpath(basePath,argv[0],sizeof(basePath));

理想情况下,为了解决这个问题,可以制作两个功能:

第一个功能:

Input:
(char[]) The .exe's folder if necessary
Output:
(int) Number of folders inside the .exe's folder.

第二个功能:

input:
(int) which folder to pick
(int) total number of folders
(char[]) the .exe's folder if necessary
Output:
(char[]) the name of the folder

有了这两个函数(它应该返回一个字符数组,而不是字符串,因为我被迫使用这些数组来使代码工作),我就可以进行一个简单的循环,每次都更改目标文件夹并将文件复制到其中

当然,这只是如何解决问题,如果有更好的解决方案,那就顺其自然吧

最后一件事:如果你能添加每个块或命令的作用,我会非常高兴,因为我还在学习c++,而且我现在是一个初学者。

假设:

  • 您使用不可移植函数[_fullpath()]1编写不可移植代码
  • 仅针对窗口
  • 在使用_fillpath()而非_wfullpath()时禁用了unicode
  • 您不想使用第三方库

如何使用windows

您可以使用FindFirstFile()和FindNextFile()来遍历目录。MSDN提供了一个很好的例子来说明如何使用它们。

不幸的是,FindFirstFile()是非常基本的,它将自己限制为基于包含通配符的文件名来搜索条目。在查找目录时,更为棘手的是:必须使用FindFirstFileEx()。函数文档中称为fSearchOp的参数应为FindExSearchLimitToDirectories

数据以WIN32_IND_data结构返回,您可以在其中读取cFileName。顺便说一句,尽量避免像255这样的硬编码长度,而更喜欢众所周知的常数(这里是特定于窗口的MAX_PATH)。

最后,当您循环时,您可以使用自己的基于C++标准的复制功能或使用特定于windows的CopyFile() 执行复制

最后备注

这种体操根本不便于携带。如果你想在windows之外的其他平台上使用你的代码,你必须使用完全不同的API,例如unix/linux和co的dirent.h。这就是为什么对于这种特殊的工作,像boost这样的第三方库非常有用。如果您有时间,可以在这里查找带有boost的目录迭代教程,并与基于windows的代码进行比较。