C에서 파일 크기를 얻는 방법

이 기사에서는 C 프로그래밍 언어를 사용하여 파일 크기를 가져오는 두 가지 접근 방식에 대해 설명합니다.

접근법 1



파일 크기를 알아야 할 때 가장 먼저 떠오르는 접근 방식은 파일을 열고 커서를 파일 끝까지 찾은 다음 커서의 위치를 ​​가져오는 것입니다. 파일 크기에 불과합니다.

이것을 어떻게 달성할 수 있는지 이해합시다.
  • 먼저 fopen 를 사용하여 파일을 엽니다. 첫 번째 인수는 파일 경로이고 두 번째 인수는 mode이며 file descriptor를 반환합니다. 파일을 수정할 필요가 없으므로 "r" 를 사용하여 읽기 모드로 엽니다.
  • 이제 각각 다음 인수를 사용하는 fseek를 사용하여 커서를 파일의 끝으로 이동합니다.
  • fd 열린 파일의 파일 설명자입니다.
  • offset 세 번째 인수 위치에서 오프셋할 양입니다.
  • whence 커서가 이동을 고려해야 하는 위치.
    파일 시작에 상대적인 SEEK_SET, 현재 위치에 상대적인 SEEK_CUR, 파일의 끝에 상대적인 SEEK_END 세 가지 옵션이 있습니다.


  • 파일의 끝으로 이동해야 하므로 끝에서 0을 이동해야 하므로 파일의 끝을 기준으로 오프셋을 0으로 설정합니다. fseek 실패하면 -1를 반환합니다.
  • 이제 ftell를 사용하여 fd를 인수로 사용하고 파일 크기인 현재 위치를 반환하는 현재 위치를 가져옵니다. 실패하면 -1 를 반환합니다.

  • NOTE: If the cursor move by 1 unit we consider it as 1 byte because the size of char is 1 byte and fopen reads the file character by character only.



    암호

    #include <stdio.h>
    
    // function get file size
    long get_file_size(char *);
    
    int main() {
        char *filename = "a.out";
        printf(
            "Size of file `%s` is %ld\n", 
            filename, 
            get_file_size(filename)
        );
    
        return 0;
    }
    
    long get_file_size(char *filename) {
        FILE *fp = fopen(filename, "r");
    
        if (fp==NULL)
            return -1;
    
        if (fseek(fp, 0, SEEK_END) < 0) {
            fclose(fp);
            return -1;
        }
    
        long size = ftell(fp);
        // release the resources when not required
        fclose(fp);
        return size;
    }
    


    산출

    Size of file `a.out` is 51880 bytes
    


    접근법 2



    이 접근 방식에서는 stat API를 사용하여 파일 크기도 포함하는 파일 정보를 가져옵니다.
    이를 위해 파일 경로를 첫 번째 인수로 사용하고 stat 구조체 변수에 대한 포인터를 두 번째 인수로 사용하고 실패 시 stat를 반환하는 -1 함수를 호출합니다.

    파일 크기를 얻으려면 간단히 st_size 속성을 사용할 수 있습니다.

    암호

    #include <sys/stat.h> // stat
    
    // inherit the above base code here
    
    long get_file_size(char *filename) {
        struct stat file_status;
        if (stat(filename, &file_status) < 0) {
            return -1;
        }
    
        return file_status.st_size;
    }
    


    산출

    Size of file `a.out` is 51880 bytes
    


    이를 사용하여 권한, 생성 시간, 사용자 ID, 그룹 ID 등과 같은 파일에 대한 다른 정보를 얻을 수 있습니다. 또한 요구 사항에 따라 사용할 수 있는 다른 함수가 정의되어 있습니다. 자세한 내용은 man page을 확인하십시오.

    어느 것을 사용해야 합니까?



    두 번째 방법은 다음과 같은 이유로 더 권장됩니다.
  • 첫 번째 접근 방식에서 수행해야 하는 파일을 열지 않아도 되므로 속도가 빠릅니다. 일부 컴파일러는 열 때 파일을 버퍼링하여 첫 번째 접근 방식을 느리게 만들 수 있습니다.
  • 이 코드는 파일 정보를 얻으려는 다른 개발자에게 더 명확합니다.

  • 하지만 이 코드는 이식성이 없습니다. 다른 API는 파일 정보를 얻기 위해 Windows와 같은 OS에서 개발됩니다.

    첫 번째 접근 방식 코드는 이식 가능합니다. 동일한 코드가 문제없이 정상적으로 작동하기 때문입니다.

    따라서 결론적으로 우리가 어떤 전략을 취해야 하는지는 전적으로 우리의 요구 사항에 달려 있습니다.


    This article is highly inspired by the content provided by Jacob Sorber on his .



    ❤️이 글을 읽어주셔서 정말 감사합니다. 저는 새로운 것을 배우는 열정적인 공대생이므로 실수를 발견하거나 제안할 사항이 있으면 댓글로 알려주세요.

    또한 이 게시물이 어떤 식으로든 도움이 된다면 공유하고 엄지손가락을 치켜세우는 것을 고려하십시오.

    좋은 웹페이지 즐겨찾기