我在 C 语言中将文件从一个目录复制到另一个目录时遇到问题。具体来说,我的代码可以很好地处理文本文件,但不能处理可执行文件。写入的字节数是正确的,文件权限也是正确的,但副本的结果类型未被文件系统识别为可执行文件(我正在 xubuntu 虚拟机上工作)并且具有“未知”类型。因此,如果我在 bash 上从命令行回显 md5sum 的结果,它们是不同的。
在下面的代码中,“checkErrno”是我定义的一个调用 perror 的函数。 “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");
提前致谢!
编辑:错误出现在我用来读取文件的函数中。一旦我发现,我就轻松解决了它。
最佳答案
您的 chmod 会清除所有位而不是设置任何位
if(chmod(fileName, fileSt.st_mode & 07777))
您需要确保副本至少被标记为可执行,也许还可以读取,(我不确定用户是否必须具有读取权限才能执行某些操作,但这很有意义。
关于在C中复制可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47837272/