複製檔案是程式設計中的常見任務。保持理智和有效率地完成這項任務至關重要。本文探討了用 C 語言複製檔案的各種技術,同時討論了它們的優缺點。我們將介紹標準 C 函數、POSIX 函數和 C 流緩衝區等。
此方法使用 C 標準函式庫函數 fread () 和 fwrite() 以區塊的形式讀取和寫入資料。雖然它提供低階控制,但它需要明確的緩衝區管理並且可能冗長。
// ANSI-C-WAY #include <stdio.h> // fopen(), fclose(), fread(), fwrite(), BUFSIZ #include <cstdio> // size_t using namespace std; int main() { // Define buffer size (BUFSIZE default is 8192 bytes) const size_t BUFFER_SIZE = 4096; char buf[BUFFER_SIZE]; size_t size; FILE* source = fopen("from.ogv", "rb"); FILE* dest = fopen("to.ogv", "wb"); while (size = fread(buf, 1, BUFFER_SIZE, source)) { fwrite(buf, 1, size, dest); } fclose(source); fclose(dest); return 0; }
此方法利用POSIX read( ) 和write() 函數,比ANSI C 方法提供更多對檔案操作的控制。它提供了處理更大文件和更細緻地處理錯誤的能力。
// POSIX-WAY #include <fcntl.h> // open() #include <unistd.h> // read(), write(), close() #include <stdio.h> // BUFSIZ using namespace std; int main() { // Define buffer size (BUFSIZE default is 8192 bytes) const size_t BUFFER_SIZE = 4096; char buf[BUFFER_SIZE]; size_t size; int source = open("from.ogv", O_RDONLY, 0); int dest = open("to.ogv", O_WRONLY | O_CREAT | O_TRUNC, 0644); while ((size = read(source, buf, BUFFER_SIZE)) > 0) { write(dest, buf, size); } close(source); close(dest); return 0; }
這種方法利用了 C I/O 流緩衝區。它簡潔明了,利用 rdbuf() 方法複製整個文件,讓 C 運行時處理低階 I/O。
// KISS-C++-Streambuffer-WAY #include <iostream> // cout, cin #include <fstream> // ifstream, ofstream using namespace std; int main() { ifstream source("from.ogv", ios::binary); ofstream dest("to.ogv", ios::binary); dest << source.rdbuf(); source.close(); dest.close(); return 0; }
C copy() 演算法可以有效率地將資料從一個檔案複製到另一個檔案。這種方法受益於 STL 強大的迭代器,無需手動處理緩衝區管理。
// COPY-ALGORITHM-C++-WAY #include <iostream> // cout, cin #include <fstream> // ifstream, ofstream #include <ctime> // clock_t, clock() #include <algorithm> // copy #include <iterator> // istreambuf_iterator, ostreambuf_iterator using namespace std; int main() { ifstream source("from.ogv", ios::binary); ofstream dest("to.ogv", ios::binary); istreambuf_iterator<char> begin_source(source); istreambuf_iterator<char> end_source; ostreambuf_iterator<char> begin_dest(dest); copy(begin_source, end_source, begin_dest); source.close(); dest.close(); return 0; }
這種方法分配自己的緩衝區,提供對記憶體管理和緩衝區大小的細微控制。它需要仔細的記憶體釋放以避免洩漏。
// OWN-BUFFER-C++-WAY #include <iostream> // cout, cin #include <fstream> // ifstream, ofstream #include <ctime> // clock_t, clock() using namespace std; int main() { ifstream source("from.ogv", ios::binary); ofstream dest("to.ogv", ios::binary); // Determine file size and allocate buffer source.seekg(0, ios::end); ifstream::pos_type size = source.tellg(); source.seekg(0, ios::beg); char* buffer = new char[size]; // Copy file source.read(buffer, size); dest.write(buffer, size); // Cleanup delete[] buffer; source.close(); dest.close(); return 0; }
Linux 特定的 sendfile() 函數利用內核層級最佳化和直接資料傳輸檔案描述符之間。這種方法以其效率而聞名,特別是在大檔案傳輸方面。
// LINUX-WAY #include <iostream> // cout, cin #include <sys/sendfile.h> // sendfile #include <fcntl.h> // open #include <unistd.h> // close #include <sys/stat.h> // stat #include <sys/types.h> // stat #include <ctime> // clock_t, clock() using namespace std; int main() { int source = open("from.ogv", O_RDONLY, 0); int dest = open("to.ogv", O_WRONLY | O_CREAT | O_TRUNC, 0644); // Determine file size struct stat stat_source; fstat(source, &stat_source); // Copy file sendfile(dest, source, 0, stat_source.st_size); close(source); close(dest); return 0; }
提供的方法在複雜性、效率和控制方面各不相同。以下是它們的優點和限制的總結:
Approach | Pros | Cons |
---|---|---|
ANSI C | Low-level control, portable | Verbose, buffer management required |
POSIX | More control than ANSI C, handles large files | Still requires explicit buffer management |
KISS-C -Streambuffer | Concise, stream buffer manages I/O | High-level, less control over buffering |
COPY-ALGORITHM-C | Efficient, STL iterators handle data transfer | Requires caution with large files to avoid buffering issues |
OWN-BUFFER-C | Fine-grained control over buffer management | Memory management must be handled carefully to avoid leaks |
LINUX-sendfile() | Fast, kernel-level optimization | Linux-specific, requires elevated privileges |
選擇最佳方法取決於您應用程式的特定要求。對於小文件,ifstream/ofstream 的簡單性可能就足夠了。對於大檔案或效率至關重要的場景,sendfile() 是一個不錯的選擇。最終,建議對不同的方法進行測試和基準測試,以確定適合您的用例的最佳解決方案。
以上是在 C 中安全快速地複製檔案的最佳方法是什麼,它們各自的優點和缺點是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!