>백엔드 개발 >C++ >C에서 파일을 안전하고 빠르게 복사하는 가장 좋은 방법은 무엇이며 각각의 장점과 단점은 무엇입니까?

C에서 파일을 안전하고 빠르게 복사하는 가장 좋은 방법은 무엇이며 각각의 장점과 단점은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-25 03:29:20538검색

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 읽기( ) 및 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 -스트림버퍼 접근 방식: 스트림 버퍼

이 접근 방식은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.