2

我正在使用 librsync 库来维护文件版本。我无法从网络打开文件。

示例(创建签名文件):

int main(int argc, char** argv)//FILE *original, FILE *signature)
{
    if(argc != 2)
    {
        cout<<"Enter the original file name."<<endl;
        exit(1);
    }

    FILE *fpa;
    fpa = fopen(argv[1],"r");

    if(fpa==NULL)
    {
        cout<<"ERROR"<<endl;
        exit(1);
    }

    FILE *fps;
    fps = fopen("sig.sig","w+");


    rs_result res = rs_sig_file(fpa, fps, 1,2,NULL);

    fclose(fpa);
    fclose(fps);

    printf("Result code: %d\n", res);

    return 0;
}

当我通过网络运行带有文件参数的程序时,例如

./a.out cs1130218@palasi.cse.iitd.ernet.in:games.txt

fpa 为空。

我猜 fopen 不是用来通过网络打开文件的。我需要一个可以做到这一点的命令。c/c++ 中的任何命令。你可以清楚地看到我想用这个程序做什么。

4

2 回答 2

4

“我需要一个可以通过网络打开文件的命令”是一个非常非常高级的操作,因此它掩盖了各种细节:应该使用什么样的网络协议?应该如何处理认证?网络错误应该如何处理?打开文件后应该做什么:读/写/两者,顺序还是随机?

librsync 是相对低级的,甚至不会尝试自己回答这些问题。它的自述文件解释说:

librsync 不实现 rsync 有线协议。如果您想与 rsync 服务器通信以传输文件,则需要使用 rsync。librsync 用于构建与 rsync 一样有效地传输文件的其他程序。您可以使用 librsync 制作备份工具,将二进制补丁分发到程序,或将目录同步到服务器或对等点之间。

要通过网络打开文件,您需要实现自己的服务器和有线协议,或者您需要使用类似的命令rsync为您处理这些细节(并且,如果您的大部分逻辑都在其他命令,C++ 可能不是该工作的最佳工具)。

于 2015-02-25T19:56:00.463 回答
1

既不librsync也不fopen处理远程文件。

考虑使用GVFS或 KIO 之类的虚拟文件系统库:它们可以通过 SFTP 打开文件,然后您可以将它们传递给 librsync。

于 2015-03-02T06:02:58.940 回答