2012-06-21 6 views
0

C 프로그램을 사용하여 지정된 디렉토리에 바이너리 파일을 작성해야합니다. 하지만, 필자는 필자는 디렉토리 구조가 존재하지 않는다면 나를 위해 하나를 만들어야한다는 것을 확실히하고 싶다.C의 디렉토리에 파일을 읽거나 쓰는 방법은 무엇입니까?

어떻게하면됩니까?

+3

무엇을 시도 했습니까? 어디서 붙어 있니? readdir (3)과 mkdir (2)에 익숙합니까? – sarnold

+1

여기 해결책을 찾을 수 있습니다 : http://stackoverflow.com/questions/675039/how-can-i-create-directory-tree-in-c-linux –

+2

내가 아는 한, 전적으로 이식 가능한 방법이 존재하지 않습니다. 디렉토리를 처리하십시오. 어떤 플랫폼을 사용하고 계십니까? – thb

답변

2

stat()을 사용하여 리프 디렉토리가 있는지 확인하고 mkdir()을 사용하여 위에서 아래로 반복하여 디렉토리를 만들어야합니다. 또는 수표를 포기하고 디렉토리 생성을 시작할 수도 있습니다. 디렉토리가 이미 존재하면 EEXIST 오류가 발생하여 실패합니다. 이것은 단지 쉬운 방법입니다.

정확성을 염두에 둔다면 더 좋은 방법이 있습니다. 원하는 경로의 후속 구성 요소 (디렉토리)에 openat()을 사용하고 부족한 경로를 생성하려면 mkdirat()을 사용해야합니다. 그렇게하면 가능한 경주를 피할 수 있습니다. 결국 openat()을 사용하여 파일을 열어야합니다.

위의 시스템 호출을 어떻게 사용해야하는지 보려면 관련 manpages을 확인하십시오.


위의로드가 충분히 길지 않은 경우 아래의 간단한 리눅스 맛의 물고기를 찾을 수 있습니다. xopen() 함수를 사용하면 지정된 경로에서 파일을 열어 경로를 따라 디렉토리를 만들 수 있습니다.

#include <errno.h> 
#include <fcntl.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <unistd.h> 

/* Look out! It modifies pathname! */ 
int xopen(char *pathname, int flags, mode_t mode, mode_t dirmode) 
{ 
    int fd, errsv; 
    int dirfd = AT_FDCWD; 
    char *ptr = pathname; 

    while (*ptr == '/') 
     ptr++; 
    for (;;) { 
     strsep(&ptr, "/"); 
     if (ptr == NULL) { 
      fd = openat(dirfd, pathname, flags, mode); 
      break; 
     } 
     while (*ptr == '/') 
      ptr++; 
     if (*ptr == '\0') { 
      errno = EISDIR; 
      fd = -1; 
      break; 
     } 
     if ((fd = mkdirat(dirfd, pathname, dirmode)) < 0 && errno != EEXIST) 
      break; 
     if ((fd = openat(dirfd, pathname, O_DIRECTORY)) < 0) 
      break; 
     if (dirfd != AT_FDCWD) 
      close(dirfd); 
     dirfd = fd; 
     pathname = ptr; 
    } 
    errsv = errno; 
    if (dirfd != AT_FDCWD) 
     close(dirfd); 
    errno = errsv; 

    return fd; 
} 
관련 문제