Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Espressif
- SK텔레콤
- 해외주식
- 라즈베리파이
- 힐스테이트 광교산
- cluster
- 빅데이터분석기사
- MQTT
- Python
- esp32
- 미국주식
- homebridge
- 파이썬
- 나스닥
- 애플
- 국내주식
- Bestin
- 현대통신
- 매터
- 배당
- Apple
- 주식
- 월패드
- 공모주
- Home Assistant
- 홈네트워크
- RS-485
- raspberry pi
- matter
- ConnectedHomeIP
Archives
- Today
- Total
YOGYUI
C++::디렉터리 존재 여부 확인하기 (g++) 본문
반응형
C++: Check Directory Existence (g++)
#include <sys/stat.h>
bool check_dir_exist(const char *path) {
bool exist = false;
struct stat st;
if(stat(path, &st) == 0) {
if( ((st.st_mode) & S_IFMT) == S_IFDIR ) {
exist = true;
}
}
return exist;
}
헤더파일 <sys/stat.h>를 include한 뒤 stat 함수 호출
int stat(const char *path, struct stat *buf);
path: 경로명 문자열 포인터 (입력)
리턴값: 0 = 성공, -1 = 실패 (실패 이유는 다양하며, errno 전역변수로 확인)
buf: 경로에 대한 정보가 담긴 stat 구조체 (출력)
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 */
};
경로의 유형은 4가지로, 16비트 정수의 최상위 4bit로 정의되어 있다
#define S_IFMT 0xF000
#define S_IFIFO 0x1000 // FIFO
#define S_IFCHR 0x2000 // Character Device
#define S_IFDIR 0x4000 // Directory
#define S_IFREG 0x8000 // Regular File
따라서 경로가 디렉터리인지 여부는 비트연산을 통해 쉽게 판별할 수 있다
(st.st_mode) & S_IFMT) == S_IFDIR;
※ S_IFDIR을 S_IFREG로 바꾸면 파일인지 여부를 확인할 수 있다
바로 테스트해보자
#include <string>
#include <iostream>
int main(int argc, char *argv[]) {
std::string path1("./test_dir_1");
std::string path2("./test_dir_2");
if (check_dir_exist(path1.c_str())) {
std::cout << "Path1 (" << path1 << ") Exist\n";
} else {
std::cout << "Path1 (" << path1 << ") Not Exist\n";
}
if (check_dir_exist(path2.c_str())) {
std::cout << "Path2 (" << path2 << ") Exist\n";
} else {
std::cout << "Path2 (" << path2 << ") Not Exist\n";
}
return 0;
}
g++ -g main.cpp -o main
테스트를 위해 빌드 결과 디렉터리에 "test_dir_1" 경로만 생성해줬다 (mkdir)
-- src
---- test_dir_1
---- main.cpp
---- main
[Git repo]
https://github.com/YOGYUI/Sniffets/tree/main/posix_check_dir_exist
[참조]
https://stackoverflow.com/questions/4980815/c-determining-if-directory-not-a-file-exists-in-linux
https://www.ibm.com/docs/en/i/7.1?topic=ssw_ibm_i_71/apis/stat.htm
반응형
'Software > C, C++' 카테고리의 다른 글
C++::Linux에서 특정 프로세스의 ID값(PID) 읽어오기 (pidof 명령어) (0) | 2022.08.22 |
---|---|
C++::Linux에서 네트워크 어댑터 MAC Address 가져오기 (0) | 2022.07.27 |
C++::chrono - 현재 날짜/시간 가져오기 (밀리초 포함) (0) | 2022.07.24 |
MFC::프로그램으로 PC 전원 끄기 (Windows OS) (0) | 2022.02.23 |
C/C++::CRC8, CRC16, CRC32 계산 라이브러리 깃허브 등록 (DLL) (0) | 2021.10.22 |