sisong / HDiffPatch

a C\C++ library and command-line tools for Diff & Patch between binary files or directories(folder); cross-platform; runs fast; create small delta/differential; support large files and limit memory requires when diff & patch.
Other
1.52k stars 280 forks source link

文件夹合并一直报110或111错误 #366

Closed CFPanda closed 9 months ago

CFPanda commented 9 months ago

你好,我在使用这个库去做patch包的合并的时候发现,文件级别的合并是成功的,但是文件夹合并失败返回110或111。这个大概是什么原因呢?

sisong commented 9 months ago

文件打开失败。 你可以自己查看 错误码表: THPatchResult 你看一下程序的错误输出,应该有更详细的原因

CFPanda commented 9 months ago

是的,我对照错误码看到了,提示文件打开失败,但是这个文件应该是没问题的。因为这个库我们在安卓和iOS上使用都是正常的,现在是在往鸿蒙上做移植,发现鸿蒙上只能做文件合并,无法做文件夹合并,是不是这个库在鸿蒙上不支持啊,内部是否可能有不兼容的逻辑。

sisong commented 9 months ago

怀疑是文件访问权限问题; 或者是某个 C api 不兼容,比如 stat() 或 文件夹 操作函数之类的函数。

建议测试: 单文件之间diff,但diff时添加 -D 参数来创建补丁,如果也能正确合并,那猜测就是目录操作有问题。

另外:失败返回110或111; 是同一个测试吗?还是不同的测试用例? 按理说,相同的测试应该返回固定的错误码。

CFPanda commented 9 months ago

1、我跟着到具体错误码返回的位置的确是stat() 这个方法返回的有问题,返回了-1。

截屏2023-11-28 14 50 27

2、失败返回110或111,都是执行的文件夹合并,只是文件夹不一样。

CFPanda commented 9 months ago

建议测试: 单文件之间diff,但diff时添加 -D 参数来创建补丁。 这个我试了,加上-D参数后,文件也合并失败了,返回错误码9。

sisong commented 9 months ago

那就是stat函数不兼容了。 可以看看这时errno的值,就知道原因了

sisong commented 9 months ago

”返回错误码9“ 单文件之间的补丁,因为生成时添加了-D,所以也需要用目录间的补丁合并方式(比如hpatch_dir)

CFPanda commented 9 months ago

errno=13,这个可以修改吗?

sisong commented 9 months ago

网上搜索 errno 13, 得到 Permission denied 即 访问权限问题,被操作系统拒绝访问了。

CFPanda commented 9 months ago

好的,感谢解答~