在C

时间:2017-12-15 17:35:48

标签: c file fwrite md5sum

我在将文件从目录复制到另一个目录时遇到问题。具体来说,我的代码适用于文本文件,但不适用于可执行文件。写入的字节数是正确的,文件权限也是正确的,但文件系统无法识别副本的结果类型(我在xubuntu虚拟机上工作)并且有"未知& #34;类型。因此,如果我在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");

提前致谢!

编辑:错误在我用来读取文件的函数中。一旦我发现我很容易解决它。

2 个答案:

答案 0 :(得分:1)

我不知道这是否是您的问题,但请记住以二进制模式打开这两个文件:&#34; wb&#34;而不只是&#34; w&#34;和&#34; rb&#34;而不只是&#34; r&#34;。

答案 1 :(得分:1)

你的chmod将清除所有位而不是设置任何

import Foundation

protocol RestProtocol {
    associatedtype PostModelType: Codable
    associatedtype GetModelType: Codable
    associatedtype PostResponseType: Codable
}

extension RestProtocol {
    static func consume(with: [String: Any],
                        completion: @escaping (GetModelType?, Error?) -> Void) {
        completion(nil, nil)
    }

    static func produce(with: PostModelType,
                        completion: @escaping (PostResponseType?, Error?) -> Void) {
        completion(nil, nil)
    }
}

struct Model<T: Codable>: Codable {
    var code: Int?
    var message: String?
    var success: Bool?
    var result: T?
}

struct Service: RestProtocol {
    typealias PostModelType = DetailsModel
    typealias GetModelType = Model<DetailsModel>
    typealias PostResponseType = Model<DetailsModel>
}

struct DetailsModel: Codable {
    var response: String?
}

Service.consume(with: ["Key": "value"]) { (response, error) in
    print("This compiles in Xcode and swift build -c release but gives Abort trap: 6 in swift build")
}

您需要确保副本至少标记为可执行文件,也可以是可读的(我不确定用户是否必须具有执行某些内容的读取权限,但这样才有意义。