본문 바로가기
Programming

리눅스 C 에서 파일 다루기

by 단창 2012. 5. 3.

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;
}



반응형