ProgrammingLang/c++

[C++ 개발자되기] 15. 파일 다루기 1부(rename, fileszie, directory listring, exists)

jinkwon.kim 2020. 2. 10. 16:08
728x90
반응형

>>[C++ 관련 모든 글 보기]

1. 파일 rename

#include <iostream>
#include <filesystem>

int main() {
  try {
    std::filesystem::rename("from.txt", "to.txt");
  } catch (std::filesystem::filesystem_error& e) {
    std::cout << e.what() << '\n';
  }
  return 0;
}

 

2. 파일 사이즈 얻기

  - stat 함수 사용

  - 파일 정보를 담는 구조체 struct stat

struct stat { 

        dev_t st_dev; /* ID of device containing file */ 

        ino_t st_ino; /* inode number */ 

        mode_t st_mode; /* 파일의 종류 및 접근권한 */ 

        nlink_t st_nlink; /* hardlink 된 횟수 */ 

        uid_t st_uid; /* 파일의 owner */ 

        gid_t st_gid; /* group ID of owner */ 

        dev_t st_rdev; /* device ID (if special file) */ 

        off_t st_size; /* 파일의 크기(bytes) */ 

        blksize_t st_blksize; /* blocksize for file system I/O */ 

        blkcnt_t st_blocks; /* number of 512B blocks allocated */ 

        time_t st_atime; /* time of last access */ 

        time_t st_mtime; /* time of last modification */ 

        time_t st_ctime; /* time of last status change */ 

};

#include <iostream>
#include <sys/stat.h>
 
int main()
{
    int ret = 0;
    struct stat buf;
    // 파일의 관한 정보를 받아올 stat 구조체 변수 선언.
    // 해당 구조체는 sys/stat.h 파일 안에 있습니다.
 
    ret= stat("test.txt", &buf);
 
    if(ret < 0)   // stat 함수에서 돌려준 결과값이 0이 아니라면 ERROR 이므로 예외 처리.
    {
        printf("ERROR\n");
        return 0;
    }
    printf("RET[%d] SIZE[%d]\n", ret, buf.st_size); 
    // buf.st_size 에 담겨 있는 값이 파일의 사이즈 입니다.

    return 0;
}

3. 디렉토리 리스팅 

  1) C++ 지원 버전

    - C++ 17 부터 공식 지원하는 std::filesystem::directory_iterator 를 사용

  2) Compile 방법

    #g++ -std=c++17 -o test test.cpp -lstdc++fs

  3) Sample Code

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    std::string path = "/root/test/"; // 검색할 폴더명
    for (const auto & entry : fs::directory_iterator(path))
        // 전체 경로 출력
        // Ex) /root/test/sample.txt
        std::cout << entry.path() << std::endl;
        // "파일명 출력"
        // "sample.txt"
        std::cout << entry.path().filename() << std::endl;
        // 파일명 출력
        // sample.txt
        std::cout << entry.path().filename().string() << std::endl;
        
}

4. 파일 확인

  1) 지원

    C++ 17 이상 부터 지원

  2) sample code

//선언 : bool exists( const std::filesystem::path& p ); 
std::filesystem::exists("helloworld.txt");

  3) 그외 에  파일 확인 방법 

https://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-14-17-c

5. 디렉토리 삭제

  1) 지원

    C++ 17 이상 부터 지원

  2) sample code

#include <filesystem>
std::filesystem::remove("myEmptyDirectoryOrFile"); // Deletes empty directories or single files.
std::filesystem::remove_all("myDirectory"); // Deletes one or more files recursively.

  3) sample code2

#include <iostream>
#include <cstdint>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
    fs::path dir = fs::temp_directory_path();
    fs::create_directories(dir / "abcdef/example");
    std::uintmax_t n = fs::remove_all(dir / "abcdef");
    std::cout << "Deleted " << n << " files or directories\n";
}

 

>>[C++ 관련 모든 글 보기]

 

[C++ 개발자되기] 1. C에는 없고 C++만 있는 것

본 Serise는 C개발자가 C++개발자로 되는 과정에서 겪은 시행 착오를 정리하는 것 입니다. 그래서 목차가 없습니다. 생존을 위한 정리 입니다. 1. 현재 언어 별 스펙 점검 - C : 7년, C로 왠만한거 다

doitnow-man.tistory.com

 

728x90
반응형