2014-01-09 31 views
0

如果我使用C或C++編寫程序,將Windows/CMD提示中的非文本文件(.mp3,.avi等)從一個位置複製到另一個位置,我是否真的依靠Windows API來執行所有操作爲我工作?複製文本文件是一回事,我可以打開它並按字符或字符串複製字符。有人能給我一個簡短的概要(如果你有參考鏈接,甚至更好,我只是問,因爲我找不到任何合理的解釋它)關於非文本文件複製程序如何工作?使用C或C++複製非文本文件?

謝謝大家!

+4

你知道可以用以下兩種模式之一打開文件:文本還是二進制文件? –

+0

按字符或字符串複製字符也是字節複製。因此,複製一個非文本文件,你可以用二進制模式打開它並逐字節複製。 – Abhineet

+0

http://stackoverflow.com/questions/1006797/tried-and-true-simple-file-copying-code-in-c –

回答

7

CopyFile已經夠用了,我

BOOL WINAPI CopyFile(
    _In_ LPCTSTR lpExistingFileName, 
    _In_ LPCTSTR lpNewFileName, 
    _In_ BOOL bFailIfExists 
); 

(從MSDN)

0

在這一天結束時,每個文件是一個字節序列。您可以逐字節(或更大的塊)複製任何文件。但是你不應該干擾文件中的數據。以二進制模式打開文件並複製。如果你使用這種方法,你的程序將適用於任何有小改動的平臺。如果您使用Windows API,只將程序限制在Windows平臺上。

+0

不要複製逐字節的字節。做更大的塊,因爲它更有效 –

+0

@EdHeal修正,謝謝。 – Chinna

0
FILE *inFile, *outFile; 

inFile = fopen(inFilePath, "rb"); 
outFile = fopen(outFilePath, "wb"); 

long getFileSize(FILE *file) { 
    long curPos, endPos; 
    curPos = ftell(file); 
    fseek(file, 0, 2); 
    endPos = ftell(file); 
    fseek(file, curPos, 0); 
    return endPos; 
} 

size_t bufferLength = getFileSize(inFile); 
uint8_t *buffer = malloc(bufferLength); 

void copyFile(FILE *inFile, FILE *outFile) { 
    fread(buffer, bufferLength, 1, inFile); 
    fwrite(buffer, bufferLength, 1, outFile); 
} 

copyFile(inFile, outFile); 
fclose(inFile); 
fclose(outFile); 

inFilePathoutFilePath必須都指向其中包含的路徑相應的文件中的字符。

上面的代碼是可移植的,以防你正在尋找不是平臺特定的東西。我將把錯誤處理留給你。此外,這是寫在匆忙所以請在使用前檢查它。