【发布时间】:2018-05-29 22:54:55
【问题描述】:
我在用 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");
提前致谢!
编辑:错误出在我用来读取文件的函数中。一旦我发现我很容易解决它。
【问题讨论】:
-
尝试给出一个简短的完整程序。您在此处显示的代码缺少很多内容,例如您读取文件的方式。
-
是的,很多代码丢失了......也许你的缓冲区“读取”不正确?请向我们展示您的阅读代码
-
如果你不知道问题是什么,你怎么知道什么代码“重要”?
-
文件由客户端在缓冲区中传递。我反复测试了读写功能,它适用于文本文件。它只是不适用于可执行文件。