C나 C++ 언어 자체로 파일상태를 완전히 다 다룰순 없다. 기껏해야 fopen 정도..
linux자체내의 system call을 이용해야 하는데 몇가지 명령어 포스팅 한다.
헤더는
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
1. 파일 또는 티렉토리의 상태 (exist or not or ....)
stat 라는 system 함수를 사용한다.
사용법은
struct stat st;
로 객체만들고,
int fl = stat("./renamed",&st)
이렇게 사용쓴다. 리턴값은 정상적으로 파일 또는 디렉토리의 정보를 얻으면 0, 에러나면 -1
자세한 에러 목록은 errno에 남는다.
stat 구조체 항목은
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in 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 */
};
이렇게 되며 각각에대한 설명도 옆에 있다.
이 객체의 펑션은
S_ISREG(m)
is it a regular file?
S_ISDIR(m)
directory?
S_ISCHR(m)
character device?
S_ISBLK(m)
block device?
S_ISFIFO(m)
FIFO (named pipe)?
S_ISLNK(m)
symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m)
socket? (Not in POSIX.1-1996.)
이것이다. 이 객체가 파일인지 디렉토리인지 다른 디바이스인지 소켓인지 다 판별한다. (리눅스에선 디바이스, 소켓, 디렉토리 모든게 다 파일이다)
2. 디렉토리 만들기
stat로 체크해서 디렉토리가 없으면 만든다.
함수는 mkdir(chat* path, mode) 인데 모드는 파일 생성 마스크이다. 0755로 하면 rwxr-xr-x가 만들어 진다.
3. 파일 이름 바꾸기 또는 이동
int rename(char* oldname, char* newname);
이고 경로가 바뀌었으면 이동하고, 경로는 같은데 파일이름만 다르면 이름 바꾼다. 에러가 나면 errno로 에러를 뱉어준다.
*참고 에러테이블은
http://www.ioplex.com/~miallen/errcmpp.html 참고
#include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> int main() { char oldname[100]; char newname[100]; char newpath[50]; struct stat st; int isDir =0; strcpy(newpath,"./renamed"); strcpy(oldname, "bspline.pdf"); sprintf(newname,"%s/%s",newpath,oldname); int fl; fl = stat("./renamed",&st); printf("stat output : %d\n",fl); if(fl ==-1) { printf("error : %s\n",strerror(errno)); if(errno == ENOENT) { mkdir(newpath,0755); printf("make %s\n",newpath); } } fl = rename(oldname, newname); if(fl == -1) { if(errno ==2) printf("No such file or directroy\n"); printf("error..NO.%d \n",errno); return 0; } else printf("%s --> %s/%s\n",oldname,newpath ,newname); return 0; }
'Programming' 카테고리의 다른 글
matlab read and play wav files (2) | 2013.02.14 |
---|---|
VTK in c++ undefined reference to ~~~~ 라이브러리를 찾지 못할때. (0) | 2012.08.09 |
fopen 의 segmentation fault. (0) | 2012.05.03 |
check if file is used or not using c on linux (0) | 2012.04.14 |
visual studio 2010 path, library 관리 (0) | 2012.02.27 |