2017-04-26 1 views
0

복사 프로그램을 만들려고합니다. 이것은 리눅스의 cp 함수와 유사합니다. ./copy file1 file2를 사용하여 파일을 성공적으로 복사 할 수 있지만 소스의 전제가 대상에 복사되지 않습니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까? 예제 및 코드는 아래에 나와 있습니다.Unix : C에서 원본 권한으로 파일 복사

내 파일 및 원래 사용 권한. My files and their original permission.

파일을 성공적으로 복사했지만 권한이 복사되지 않았습니다. Successfully copied the file but the permission was not copied.

#define buff_s  4096 
#define mod  0644 

void printError(char *, char *); 

main(int ac, char *txts[]) 
{ 
    int  input, output, n_chars; 
    char buf[buff_s]; 

    struct stat file1; 
    struct stat file2; 
    stat(txts[1], &file1); 
    stat(txts[2], &file2); 

    if ((input=open(txts[1], O_RDONLY)) == -1) 
     printError("error", av[1]); 

    if ((output=creat(txts[2], mod)) == -1) 
     printError("error", txts[2]); 
+1

또한'read()'와'write()'는'int' 대신에'ssize_t'를 리턴한다는 것에주의하십시오. 그들은 같은 것이 아닙니다. –

+0

지적 해 주셔서 감사합니다. – mmm

+0

Garg365, 나는 당신이 제공하는 방법을 시도 할 것이다, 나는 그것도 잘 동작 할 것이라고 생각한다. – mmm

답변

4

당신은 단지 소스 파일의 읽기 권한과 대상 파일에 동일한 권한을 설정해야합니다. 당신이 그들을 설정하는 권한과 chmod()을 읽을 stat()를 사용할 수 있습니다

#include <sys/stat.h> 

void copyPermission(const char* fromFile, const char* toFile) { 
    struct stat tmp; 
    stat(fromFile, &tmp); 
    chmod(toFile, tmp.st_mode); 
} 

(N.B. 오류 검사 생략). 하단에 main 기능에

당신은 간단하게이 작업을 수행 할 수 있습니다

대신 :

if ((out_fd=creat(av[2], COPYMODE)) == -1) 

chmod(av[2], file1.st_mode); 

다른 옵션은 단순히 올바른 권한을 사용하여 파일을 만드는 것입니다

do

if ((out_fd=creat(av[2], file1.st_mode)) == -1) 
+2

파일이 복사되고 프로세스에 열린 파일 기술자가 있기 때문에'fstat()'와'fchmod()'도 사용할 수있다. 파일 설명자에 직접. –

+0

내가 준 두 번째 해결책이 최선이라고 생각합니다. 도와 주셔서 감사합니다 :). 수업은 배웠고, 나는 그것이 그렇게 단순하다고 생각한 적이 없었다. – mmm

+0

Andrew Henle, 나는 귀하의 방법을 시도하고 곧 솔루션을 업데이트 할 것입니다. (작동하는 경우) – mmm

관련 문제