목차
1. <unistd.h> 디렉토리 조작 함수들
2. <sys/types.h>,<sys/dir.h> 디렉토리 스캔 및 소팅 디렉토리
3. 파일 조작 루틴들: unistd.h, sys/types.h, sys/stat.h
4. 파일 상태
5. 파일조작: stdio.h, unistd.h
6. 임시 파일 생성:<stdio.h>
유닉스는 디렉토리들과 파일들의 조작을 위해서 많은 유틸리티를 제공한다.
cd, ls, rm, cp, mkdir 등등 ...
이런 명령어를 어떻게 비슷하게 C 함수에서 만들수 있을까?
1. <unistd.h> 디렉토리 조작 함수들
디렉토리 계층을 순환하거나 디렉토리 내용에 대해서 질의 하면서 적당한 함수들을 호출할 수 있도록 해주는 헤더이다.
int chdir(char *path) -- 특정 경로 문자열로 디렉토리를 접근한다.
if (chdir(argv[1]) != 0)
{ printf("Error in chdir\n");
exit(1);
}
char *getwd(char *path) -- 현재 구동 디렉토리의 전체 경로 이름을 반환한다.
path가 반환되어 지는 경로의 포인터이다.
2. <sys/types.h>,<sys/dir.h> 디렉토리 스캔 및 소팅 디렉토리
(멀티 쓰레드 상이 아니라 BSD 플랫폼 상에서) 두개의 유용한 함수가 있다.
scandir(char *dirname, struct direct **namelist, int (*select)(), int (*compare)())
디렉토리 dirname을 읽고 디렉토리 엔트리들의 포인터의 배열을 빌드하거나 에러(-1)를 생성한다.
namelist는 구조체 포인터들의 배열이다
select는 디렉토리 엔트리의 포인터이다(<sys/types>에 정의)
마지막 아규먼트 compare는 qsort로 전달한다. NULL 이면 소팅하지 않는다.
예제:
alphasort(struct direct **d1, **d2) - 알파벳 순으로 소팅.
#include <sys/types.h>
#include <sys/dir.h>
#include <sys/param.h>
#include <stdio.h>
#define FALSE 0
#define TRUE !FALSE
extern int alphasort();
char pathname[MAXPATHLEN];
void main()
{
int count,i; struct direct **files;
int file_select();
if (getwd(pathname) == NULL )
{
printf("Error getting path\n");
exit(0);
}
printf("Current Working Directory = %s\n",pathname);
count = scandir(pathname, &files, file_select, alphasort);
/* 파일을 찾지 못하면, 선택없는 메뉴 아이템을 만든다. */
if (count <= 0) {
printf("No files in this directory\n");
exit(0);
}
printf("Number of files = %d\n",count);
for (i=1;i<count+1;++i)
printf("%s ",files[i-1]->d_name);
printf("\n"); /* flush buffer */
}
int file_select(struct direct *entry)
{
if ((strcmp(entry->d_name, ".") == 0) ||
(strcmp(entry->d_name, "..") == 0))
return (FALSE);
else return (TRUE);
}
scandir 함수는 현재 디렉토리(.)와 상위 디렉토리(..)의 모든 파일들을 리턴한다.
file_select 함수를 이렇게 .h .o .c 파일만 찾도록 만들 수 있다.
다음은 .h .o .c 파일만 찾도록 만든 file_select 함수이다
int file_select(struct direct *entry)
{
char *ptr;
char *rindex(char *s, char c);
if ((strcmp(entry->d_name, ".")== 0)
||(strcmp(entry->d_name, "..") == 0))
return (FALSE);
/* 파일 확장자를 체크한다. */
ptr = rindex(entry->d_name, '.')
if ((ptr != NULL) &&
((strcmp(ptr, ".c") == 0) ||
(strcmp(ptr, ".h") == 0) ||
(strcmp(ptr, ".o") == 0) ))
return (TRUE);
else
return(FALSE);
}
rindex 함수는 문자열 s내에 문자 c의 마지막 나타난 곳의 포인터를 리턴하거나, NULL을 리턴한다.
(r은 reverse를 나타내므로 마지막 나타난곳 반대는 index() 함수이다)
3. 파일 조작 루틴들: unistd.h, sys/types.h, sys/stat.h
파일 접근 함수
int access(char *path, int mode)
R_OK - 읽기 권한 테스트
W_OK - 쓰기 권한 테스트
X_OK - 실행이나 검색 권한 테스트
F_OK - 디렉토리들이 파일을 검색하거나 존재유무 테스트.
access() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다.
int chmod(char *path, int mode) : 파일의 접근 모드를 바꾼다.
chmod() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다.
4 (octal 100) = read only,
2 (010) = write,
6 (110) = read
그리고 write, 1 (001) = execute
4. 파일 상태
파일의 현재 상태를 질의하는 유용한 함수
int stat(char *path, struct stat *buf),
int fstat(int fd, struct stat *buf)
stat(), 와 fstat() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다..
에러는 다음 헤더에 있다. #include <sys/stat.h>
5. 파일조작: stdio.h, unistd.h
int remove(const char *path);
int rename(const char *old, const char *new);
int unlink(cons char *path) --- path 이름의 디렉토리 요소를 제거한다.
unlink() 리턴값: 0 success, -1 failure 그리고 errno에 해당 에러를 담는다..
에러는 다음 헤더에 있다. #include <sys/stat.h>
link(const char *path1, const char *path2) ---
기존 디렉토리 요소 path1을 새로운 엔트리인 path2에 링크시킨다.
6. 임시 파일 생성:<stdio.h>
임시 파일의 조작은 운영체제에서 한다(파일 삭제 등등)
FILE *tmpfile(void) --- 임시파일을 생성하고 스트림을 연다. 파일레퍼런스가 닫히면 삭제된다.
char *tmpnam(char *s) 함수는 임시파일을 안전하게 사용할 수 있도록 해준다.
char *tmpnam_r(char *s)와
char *tempnam(const char *dir, const char *pfx) 도 존재한다.
이상
'프로그래밍' 카테고리의 다른 글
[자바] apache-commons-net FtpClient 래퍼 및 파일 다운로드 (0) | 2023.01.18 |
---|---|
[Java] JTable, JscrollPane을 사용한 스크롤 바 활성화 (0) | 2023.01.16 |
프로그래밍 씨,씨,씨 - 함수, union (0) | 2023.01.10 |
바이너리검색 (0) | 2022.12.28 |
fabs, abs, sprintf, format (1) | 2022.12.27 |