C/C++ 관련 포스팅 목록
2020/06/26 - [Linux/C] - C 언어 API sprintf(문자열 붙이기)
2020/07/01 - [Linux/C] - C/C++ API 문자열 특정 문자로 나누기(strtok)
2020/06/28 - [Linux/C] - C언어 API strchr(특정 문자 위치 검색)
2020/06/27 - [Linux/C] - C언어 API access(파일 존재 여부 확인)
파일 존재 확인
안녕하세요.
오늘은 C언어에서 특정 경로에 파일이 있는지 확인하는 방법에 알아보겠습니다.
우리는 흔히 새로운 파일을 만들기 전에 자주 고민에 빠집니다. 지금 만들려는 파일이 이미 있다면 안 만들고, 만약에 없다면 새로 만들고 싶을 때, 바로 사용하는 API가 파일 존재 여부 API입니다.
C에서 제공하는 함수중 access()가 이러한 기능을 처리해줍니다. 디렉토리 또는 파일이 특정 경로에 존재하는지 파악하여 결과를 반환합니다.
자 그러면 access() API의 함수 원형을 확인하고 전달해야하는 인자들과 어떤 값들을 반환하는지에 대하여 알아보겠습니다. 이 포스팅에선 리눅스 우분투 환경에서 수행하도록 하겠습니다.
Access
#include <unistd.h >
int access(const char *pathname, int mode);
#인자
pathname: 존재 여부를 확인할 경로 문자열
mode: 파일의 권한 또는 존재 여부를 확인하기 위한 옵션 값
#반환
권한 없음 또는 존재하지 않는 경우: -1
권한이 있거나 존재하는 경우: 0
위의 인자중에서 mode의 값은 특정 경로에 있는 파일이나 디렉토리에 읽기/쓰기/실행 의 권한이 있는지 확인하거나 파일이나 디렉토리가 그 경로에 존재하는지에 대해 어떤 것을 물어볼 것인지 결정하는 옵션 값입니다.
물론 현재 프로그램을 실행하는 사용자를 기준으로 확인합니다. mode의 값은 아래와 같습니다.
mode 옵션명 | 의미 |
R_OK | 읽기 권한 확인 |
W_OK | 쓰기 권한 확인 |
X_OK | 실행 권한 확인 |
F_OK | 파일 존재 여부 확인 |
자 이제 실제 access API를 통해 내가 특정 경로의 파일에 읽기/쓰기/실행 권한이 있는지와 파일이 존재하는지 확인해보겠습니다.
예제 - 특정 경로의 파일 존재여부 확인
이 포스팅에선 윈도우 개발 환경에서 예제 테스트를 진행하겠습니다. 먼저 터미널을 실행하고 아래의 경로에 txt 문서를 생성합니다.
$ cd /home/{사용자계정명}
$ mkdir tmp; cd tmp
$ echo "access example" > test.txt
그리고 아래와 같은 예제 프로그램을 작성합니다.
$ cd /home/{사용자계정명}
$ mkdir tmp; cd tmp
$ vim access_example.c
#include <unistd.h>
void main() {
int r = 0;
r = access("/home/{사용자계정명}/tmp/test.txt", F_OK);
if (r < 0) printf("파일이 존재하지 않습니다.\n");
else printf("파일이 존재합니다.\n");
}
작성이 완료되었다면 이제 c 소스파일을 실행 파일로 컴파일하고 실행 하겠습니다. 아래의 명령어를 실행합니다.
$ gcc -c access_example.c -o access_example.out
$ gcc -o access_example access_example.out
$ ./access_example
위의 결과를 확인해보면 실제 파일이 있기 때문에 0을 반환한 것을 알 수 있습니다. 반대로 txt 문서를 삭제하고 이 프로그램을 다시 실행해보겠습니다.
위와 같이 파일이 존재하지 않기 때문에 -1이 반환되고 있습니다.
예제 - 읽기/쓰기/실행 권한 확인
자 다시 txt 문서를 만들고 아래와 같이 권한을 확인하는 옵션을 사용하여 실행해보겠습니다.
$ cd /home/{사용자계정명}
$ mkdir tmp; cd tmp
$ echo "permission example!" > test.txt
$ vim permission_example.c
#include <unistd.h>
void main() {
int r = 0;
char *path = "/home/{사용자계정명}/tmp/test.txt";
printf("현재 리눅스 사용자가 해당 파일에 어떤 권한이 있는지 확인합니다.\n\n");
r = access(path, R_OK);
if (r < 0) printf("해당 파일에 읽기 권한이 없습니다.\n\n");
else printf("해당 파일에 읽기 권한이 있습니다.\n\n");
r = access(path, W_OK);
if (r < 0) printf("해당 파일에 읽기 권한이 없습니다.\n\n");
else printf("해당 파일에 읽기 권한이 있습니다.\n\n");
r = access(path, X_OK);
if (r < 0) printf("해당 파일에 읽기 권한이 없습니다.\n\n");
else printf("해당 파일에 읽기 권한이 있습니다.\n\n");
}
$ gcc -c permission_example.c -o permission_example.out
$ gcc -o permission_example permission_example.out
$ ./permission_example
각 권한에서 현재 사용자가 해당 파일에 모든 권한이 있기 때문에 전부 0을 반환하고 있습니다. 자 그러면 test.txt 파일에 현재 사용자가 읽기/쓰기만 가능하고 실행은 못하도록 권한을 수정한 후 프로그램을 다시 실행해보겠습니다.
$ chmod 600 ./test.txt
$ ls -al
$ ./permission_example
마무리
이번 포스팅에서는 C언어에서 access API를 사용하는 방법에 대해 알아보았습니다.