rename(3)

#include <stdio.h>

int rename(const char *oldpath, const char *newpath);

rename(3)은 파일 또는 디렉토리의 이름을 변경합니다. 

 

oldpath가 파일인 경우 

 - newpath 파일이 이미 있는 경우에는 newpath 파일을 삭제하고 oldpath를 newpath로 변경합니다.

 - newpath가 없는 파일인 경우 oldpath 파일을 newpath 파일로 rename합니다.

 - 그러나, oldpath와 newpath가 mount된 파일 시스템이 다르면 오류가 발생합니다.

 - newpath가 디렉토리인 경우에는 오류가 발생합니다.

 

oldpath가 디렉토리의 경우

 - newpath가 없는 디렉토리이면 정상적으로 newpath로 이름이 변경됩니다.

 - newpath가 이미 존재하고 비어있는 디렉토리이면 newpath를 삭제하고 oldpath를 newpath로 이름을 변경합니다.

 - newpath가 디렉토리가 아니거나 비어있지 않은 디렉토리이면 오류가 발생합니다.

 - oldpath와 newpath가 mount된 파일 시스템이 다르면 오류가 발생합니다.

 

rename은 파일 또는 디렉토리의 이름은 변경되어도 inode가 변경되지 않기 때문에, oldpath에 대해서 어떤 프로세스가 파일을 open하여 읽고 쓰기를 해도 newpath에 대해서 읽고 쓰기가 이루어집니다.

 

 

파라미터

oldpath
    -  이름을 변경하려는 원본 파일 또는 디렉토리명
newpath
    - 변경될 새로운 이름

 

RETURN

0
    - 정상적으로 파일명이 변경되었습니다.

-1
    - 오류가 발생하였으며, 상세 오류 내용은 errno 전역변수에 설정됩니다.

   EACCES : oldpath 또는 newpath를 구성하는 디렉토리에 대해서 
            search permission이 없거나 쓰기 권한이 없습니다.
   EBUSY : oldpath 또는 newpath가 시스템 또는 다른 프로세스에 의해서 사용되고 있습니다.
   EEXIST or ENOTEMPTY : newpath가 디렉토리이며, 비어있지 않습니다.
   EINVAL : newpath의 디렉토리에 oldpath가 포함되어 있습니다.
   EIO : 물리적 I/O 오류가 발생하였습니다.
   EISDIR : oldpath는 파일인데, newpath는 디렉토리입니다.
   ELOOP : 디렉토리 구성에 symbolic link가 looping 구조로 되어 있습니다.
   EMLINK : oldpath가 디렉토리이고 newpath 디렉토리의 부모 디렉토리가 
           link count 최대치에 도달하였습니다.
   ENAMETOOLONG : oldpath 또는 newpath의 full path명이 최대길이에 도달하였거나 
           하나의 파일 또는 디렉토리명이 이름 최대길이에 도달하였습니다.
   ENOENT : oldpath가 존재하지 않거나 oldpath 또는 newpath 문자열이 비어 있습니다.
   ENOSPC : newpath가 위치할 디렉토리에 공간이 없어서 확장할 수 없습니다.
   ENOTDIR : oldpath는 디렉토리인데, newpath는 디렉토리가 아닙니다.
   EPERM or EACCES : 파일 또는 디렉토리에 대한 owner가 아니어서 권한이 없습니다.
   EROFS : read-only 파일 시스템입니다. 
   EXDEV : oldpath와 newpath는 다른 파일 시스템입니다.
   ETXTBSY : shared lib이거나 명령어로 실행중에 있습니다.

 


활용 예제

 

Sample : 간이 mv 명령어

#include <stdio.h>
#include <errno.h>
#include <string.h>

/*
* mv 명령어와는 달리 같은 mounted 파일 시스템에서만 동작합니다.
* 그 외에도 파일 to directory는 오류가 발생합니다. 
* 파일 to 파일. 디렉토리 to 디렉토리만 정상적으로 수행됩니다.
*/

int main(int argc, char *argv[])
{
    if(argc != 3) {
        printf("%s {src} {dest}\n", argv[0]);
        return 0;
    }

    if(rename(argv[1], argv[2]) == -1) {
        fprintf(stderr, "rename error: %s\n", strerror(errno));
        return 1;
    }

    return 0;
}

 


 

see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요