首頁 > 後端開發 > C++ > 在 C 中安全快速地複製檔案的最佳方法是什麼,它們各自的優點和缺點是什麼?

在 C 中安全快速地複製檔案的最佳方法是什麼,它們各自的優點和缺點是什麼?

Mary-Kate Olsen
發布: 2024-12-25 03:29:20
原創
546 人瀏覽過

What are the best methods for safely and quickly copying files in C  , and what are their respective advantages and disadvantages?

在 C 語言中安全快速地複製檔案

概述

複製檔案是程式設計中的常見任務。保持理智和有效率地完成這項任務至關重要。本文探討了用 C 語言複製檔案的各種技術,同時討論了它們的優缺點。我們將介紹標準 C 函數、POSIX 函數和 C 流緩衝區等。

ANSI C 方法:fread() 和 fwrite()

此方法使用 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()

此方法利用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;
}
登入後複製

KISS-C -Streambuffer 方法:流緩衝區

這種方法利用了 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;
}
登入後複製

COPY-ALGORITHM-C 方法:copy() 演算法

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 方法:自己的緩衝區管理

這種方法分配自己的緩衝區,提供對記憶體管理和緩衝區大小的細微控制。它需要仔細的記憶體釋放以避免洩漏。

// 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 特定的 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板