2014-10-01 57 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

相關問題