2017-12-15 2 views
-1

C에서 파일을 다른 디렉토리로 복사하는 데 문제가 있습니다. 특히 코드가 텍스트 파일에서는 잘 작동하지만 실행 파일에서는 제대로 작동하지 않습니다. 기록 된 바이트 수는 정확하고 파일 권한도 같지만 파일 시스템에서 사본의 결과 유형을 실행 가능으로 인식하지 못합니다 (저는 xubuntu 가상 시스템에서 작업 중입니다). "알 수 없음"유형이 있습니다. 따라서 bash에서 md5sum의 결과를 명령 행에서 반향하는 경우에는 다릅니다.C에서 실행 파일 복사

다음 코드에서 "checkErrno"는 perror를 호출하는 me 정의 함수입니다. "currDir"은 현재 디렉토리이고 "DIRNAME"은 이동하려는 디렉토리입니다. 모든 라이브러리가 올바르게 포함되어 있습니다. 중요한 코드 묶음을 복사하여 붙여 넣었습니다.

struct stat fileSt; 
if(stat(fileName,&fileSt) != 0) checkErrno("Stats file"); 
char currDir[PATH_MAX]; 
FILE* file; 
if(getcwd(currDir,PATH_MAX) == NULL) checkErrno("Currdir"); 
if(chdir(DIRNAME) != 0) checkErrno("Chdir"); 
if((file = fopen(fileName,"w")) == NULL) checkErrno("Create file"); 
if(chmod(fileName, fileSt.st_mode & 07777)) perror("chmod"); 
if(fwrite(fileMsg.data.buf,1,fileSize,file) < fileSize) checkErrno("fwrite"); 
fflush(file); 
if(fclose(file) != 0) checkErrno("fclose"); 
if(chdir(currDir) != 0) checkErrno("chdir"); 

미리 감사드립니다.

+3

짧은 _complete_ 프로그램을 제공하십시오. 여기에 표시된 코드에는 파일을 읽는 방법과 같은 많은 내용이 누락되었습니다. –

+2

많은 코드가 필요합니다. missing ... 아마도 버퍼가 잘못 읽혀진 것입니까? 읽은 코드를 알려주십시오. – Grantly

+2

무엇이 "중요한"코드인지 어떻게 알 수 있습니까? 문제는? –

답변

1

이것이 문제가되는지는 모르겠지만 두 파일을 "w"대신 "wb"로, "r"대신 "rb"로 두 파일을 열어야합니다.

+0

그게 전부 였어................ 지금 (지금은 그것을 찾으려고 노력하고있다. 확실한 대답을 찾지 못했다. .. 나는 당신과 동의하는 경향이있다.). ? – Grantly

+0

감사합니다. 이미 시도했지만 여전히 작동하지 않습니다! – Gixuna

+2

@Grantly : 유닉스에서 'b'는 일반적으로 필요하지 않습니다. –

1

모든 비트를 취소하는 대신 당신은 사용자가있는 경우 잘 모르겠어요 (뿐만 아니라, 복사가 적어도 실행 표시되어 있는지 어쩌면 읽을 수 있도록해야하는

if(chmod(fileName, fileSt.st_mode & 07777)) 

설정합니다 귀하의 chmod를 어떤 것을 실행하는 데 읽기 권한이 있지만 이해가됩니다.

+0

실행 권한이 필요하지 않습니다. 실행 플래그가 설정되어 있으면 읽기 권한이없는 사람이라도 누구나 이진 파일을 실행할 수 있습니다 (UNIX/POSIX의 경우에는 다른 시스템이 Windows를 좋아하는지 모릅니다) – Ankush