2014-10-01 107 views
0

我想创建一个教育目的的程序,应该能够复制一个文件(的任何扩展名,该文件的名称永远不会改变)在同一目录中的.exe到主目录内的所有目录。 因此,例如我有:C++ - 复制文件到所有子目录

  • Main_Directory
  • 的Program.exe
  • file.something
  • directory1中
  • Directory2
  • directory3目录

在这种情况下,程序应该将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++,而我目前是初学者。

+5

boost的目录迭代器对于这样的事情来说非常棒。 – AndyG 2014-10-01 17:29:35

+1

如果您正在学习C++,除非您特别*知道*如何在C中完成或想要比较/对比,否则不要交叉标记C. “自然”解决方案可能非常不同。 – crashmstr 2014-10-01 17:31:51

+0

AndyG:如果可能的话,我不想使用外部资源,但如果它们更好,那么他们是受欢迎的。我很抱歉,这是我在stackoverflow上的第一个问题。 – iv2b 2014-10-01 17:33:40

回答

0

假设:

  • 你写的非移植的代码,利用非便携式功能[_fullpath()] 1
  • 只指定
  • 您使用Unicode工作当您使用_fillpath()禁用的Windows,而不是_wfullpath()
  • 你不想使用第三方库

如何用windows做到这一点?

您可以使用FindFirstFile()和FindNextFile()遍历目录。 MSDN有一个nice example如何使用它们。

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

数据以WIN32_FIND_DATA结构返回,您可以在其中阅读cFileName。顺便说一句,尽量避免以任何代价硬编码的长度,如255,并更喜欢众所周知的常量(这里是特定于窗口的MAX_PATH)。

最后,当你在循环,您既可以使用自己的C++标准的基于复印功能,或使用特定的窗口CopyFile()

结束语

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

+0

:谢谢你的回答,这真的很有用! 但是,假设可执行文件位于文件夹a \ b \ c中,如果将第一个变量设置为“a \ b \ c”,那么它将从a \ b文件夹中选择文件。但是,如果我输入任何东西像\ b \ c \ *。*第一个文件是一个点,而如果我输入一个\ b \ c \ *然后它会打印出奇怪的东西。 我应该给什么作为输入? – iv2b 2014-10-02 16:09:39

+0

我想我修复了它: 我已经把三个文件夹放在exe文件夹中,它们被命名为x,y,z。如果我搜索路径'a \ b \ c \ *'。多次(假设程序在\ b \ c中),那么输出将是:。 .. x y z z z z z。结果足以让程序成功运行! 但是,我想知道输出是否会更“漂亮”,或者调用是否如此... *编辑* 使用\ b \ c \ *。还列出了带有点的文件夹。 但是,它没有列出带点的文件夹_ending_。在这种情况下,我需要使用\ *。*,但它会列出所有文件。 – iv2b 2014-10-02 16:53:39

+0

刚刚完成该程序,它奇妙地工作! 谢谢你的回答,它帮助我完成了它! ^^ – iv2b 2014-10-02 17:40:15

相关问题