Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 进行Carbon FSExchangeObject比较调用的Cocoa方法是什么?_Macos_Cocoa_Nsfilemanager_Macos Carbon_Apfs - Fatal编程技术网

Macos 进行Carbon FSExchangeObject比较调用的Cocoa方法是什么?

Macos 进行Carbon FSExchangeObject比较调用的Cocoa方法是什么?,macos,cocoa,nsfilemanager,macos-carbon,apfs,Macos,Cocoa,Nsfilemanager,Macos Carbon,Apfs,旧的MoreFilesX中有一个很棒的函数,FSExchangeObjectsCompat,“在两个文件之间交换数据”。它通常作为安全保存方法的一部分使用,在安全保存方法中写入临时文件,然后调用FSExchangeObjectsCompat以将新保存的临时文件与旧的“原始”文件交换。它保留了所有元数据、特权等 我在High Sierra、APFS卷上看到此功能失败,而在HFS+卷上从未失败过。没什么大不了的——许多这样的电话都被否决了 但是,做同样事情的方法是什么呢?您可以使用较低级别的函数来做

旧的MoreFilesX中有一个很棒的函数,FSExchangeObjectsCompat,“在两个文件之间交换数据”。它通常作为安全保存方法的一部分使用,在安全保存方法中写入临时文件,然后调用FSExchangeObjectsCompat以将新保存的临时文件与旧的“原始”文件交换。它保留了所有元数据、特权等

我在High Sierra、APFS卷上看到此功能失败,而在HFS+卷上从未失败过。没什么大不了的——许多这样的电话都被否决了


但是,做同样事情的方法是什么呢?

您可以使用较低级别的函数来做类似的事情。下面是我编写的用于10.12之前版本SDK的代码。如果您使用10.12 SDK或更高版本进行编译,您可以使它变得更简单,如果您的部署目标是10.12或更高版本,则更简单

\ifndef重命名\u交换
#定义重命名交换0x00000002
#恩迪夫
/*!
@函数交换文件
@摘要给定同一卷上两个文件的完整路径,
交换内容。
@讨论这通常是安全保存策略的一部分。
@param inOldFile文件的完整路径。
@参数inNewFile文件的完整路径。
@如果一切顺利,结果为0,否则为1。
*/
int交换文件(常量字符*INLODFILE,常量字符*inNewFile)
{
int结果=-1;
静态调度\u once\u t sOnce=0;
静态重命名FuncType sRenameFunc=NULL;
//尝试获取指向renamex_np的函数指针,该指针在OS 10.12及更高版本中可用。
发送一次(&S),
^{
sRenameFunc=(renameFuncType)dlsym(RTLD_默认值,“renamex_np”);
});
//renamex_np仅在OS 10.12及更高版本上可用,不适用于HFS+卷
//但APFS卷确实有效。作为最新和最伟大的产品,我们首先尝试。
如果(sRenameFunc!=NULL)
{
结果=(*sRenameFunc)(inOldFile、inNewFile、RENAME\u SWAP);
}
如果(结果!=0)
{
//exchangedata是一个较旧的函数,可在HFS+上运行,但不能在APFS上运行。
结果=交换数据(inOldFile,inNewFile,0);
}
如果(结果!=0)
{
//这两种功能都不起作用,我们必须走老路。
std::字符串名称模板(inOldFile);
名称模板+=“-swapxxx”;
//制作模板的可变副本
std::vector工作路径(nameTemplate.size()+1);
memcpy(&workPath[0],nameTemplate.c_str(),nameTemplate.size()+1);
mktemp(&工作路径[0]);
std::字符串tempPath(&workPath[0]);
//使旧文件具有临时名称
结果=重命名(inOldFile,tempPath.c_str());
//将新文件数据置于旧名称下。
如果(结果==0)
{
结果=重命名(在newfile,inOldFile中);
}
//将旧数据放在新名称下。
如果(结果==0)
{
结果=重命名(tempPath.c_str(),inNewFile);
}
}
返回结果;
}

您需要。

只是想澄清一点——虽然这是首选方法,但实际上它不会将replaceItemAttribute与WithItemAttribute“交换”。执行此操作后,原始文件将位于同一目录中的backupItemName,然后需要与WithItemAttribute进行交换,以实现与FSExchangeObjectsCompat()相同的功能,对吗?提供
backupItemName
是可选的。如果未传递该选项或选项,则实现可能(并且很可能)执行您所寻求的类型的交换。为供将来参考,WithItemAtrol中的“新”文件在替换ReplaceItemAtrol中的文件后始终会被删除。如果提供了ReplaceTimeTurall,则ReplaceTimeTurall中的“原始”文件将复制到backupItemName,并且也将被删除,除非指定了NSFileManagerItemReplacementWithoutDeletingBackupItem选项标志。所以这与交换并不完全相同,但似乎已经足够接近了。不确定这是否优于或更倾向于在10.12或更高版本上使用renamex_np,或者当存在APFS时。