2011-07-24 46 views
9

它看起來像這個問題很簡單,但我無法找到明確的解決方案複製文件在C中沒有平臺依賴。如何在沒有平臺依賴的情況下以C複製文件?

我在我的開源項目中使用了system()調用來創建目錄,複製文件和運行外部程序。它在Mac OS X和其他Unix-ish系統中運行良好,但在Windows上失敗。問題是:

system("cp a.txt destination/b.txt"); 
  • Windows使用反斜線路徑分隔符。 (vs Unix-ish中的斜槓)
  • Windows對內部複製命令使用「複製」。 (vs Unix中的cp)

我該如何寫一個不依賴的複製代碼?

(其實,我寫的宏來解決這個問題,但它是不冷靜。http://code.google.com/p/npk/source/browse/trunk/npk/cli/tests/testutil.h,L22-56)

+0

問題不晃來晃去的「複製」如上所述。 – lqez

回答

6

您需要使用C標準庫函數stdio.h

特別地,fopen,fread,fwritefclose就足夠了。

一定要在fopen的標誌中包含b(「binary」)選項。

[編輯]

不幸的是,文件名本身(向前斜線與回斜線)仍然依賴於平臺。所以你需要某種#ifdef或類似的處理。

或者您可以使用cross-platform toolkit

+0

謝謝你的回答。但是跨平臺的工具包對於我的小項目來說太大了。沒有任何簡單的解決方案來解決斜槓問題嗎? – lqez

+2

由於目錄組織是特定於平臺的,因此並不是一個完全無關緊要的方法。但是,在API級別,Windows在路徑名中接受斜槓或反斜槓(它是需要反斜槓的cmd.exe外殼)。所以,只要你的Unix名稱不包含反斜線(也可能不是冒號),你就可以。 –

+0

@Jonathan:好吧,我承認我不知道。那些帶有斜槓的文件名稱,在Windows上是合法的?也許我應該在某個時候嘗試:-) – Nemo

0

使用標準C庫stdio.h。首先使用fopen(inputFilename, "rb")打開輸入文件並使用fopen(outputFilename, "wb")寫入打開輸出文件,使用freadfwrire複製內容。然後使用fclose關閉這兩個文件。

8

system()功能比它的價值更麻煩;它以單獨的進程調用shell,通常應該避免。

相反fopen()a.txtdest/b.text,並使用getc()/putc()做複製(因爲標準庫更容易做頁對齊的緩衝比你)

FILE *src = fopen("a.txt", "rb"); 
FILE *dst = fopen("dest/b.txt", "wb"); 
int i; 
for (i = getc(src); i != EOF; i = getc(src)) 
{ 
    putc(i, dst); 
} 
fclose(dst); 
fclose(src); 
+0

謝謝你的回答。但它不能解決路徑分隔符問題。 – lqez

+1

根據:http://msdn.microsoft.com/en-us/library/77859s1t(v=VS.71).aspx路徑分隔符是一個'system()'問題,而不是'fopen()'。由於shell調用,它在系統中失敗。 – Dave

+0

非常感謝您的幫助。 – lqez

相關問題