gpt4 book ai didi

c# - 如何在不直接将参数传递给 ln 实用程序的情况下从应用程序内部创建硬链接(hard link) (Linux)?

转载 作者:太空狗 更新时间:2023-10-29 11:13:20 27 4
gpt4 key购买 nike

为了举例,我将使用 C#。我需要知道调用 api 的哪一部分。

我在一般搜索中一直没有成功,因为似乎大多数人更喜欢简单地调用 ln 实用程序并将适当的参数传递给它。有人告诉我,为您可以合理地做的任何事情调用 shell 实用程序并不是一种好的形式。

我知道 .net 和 mono 不包含任何处理符号链接(symbolic link)或硬链接(hard link)的方法。我已被指向 system.io,但我没有成功找到硬链接(hard link)的文档。

对于那些想知道什么是硬链接(hard link)的人,

https://en.m.wikipedia.org/wiki/Hard_link

最佳答案

我假设您的意思是,如何在不删除 ln 命令的情况下创建硬链接(hard link)。

简答,

using Mono.Unix.Native;
Mono.Unix.Native.Syscall.link(string oldname, string newname).

最终您通过调用 link() 函数来完成此操作

查看 man page : link() 创建到现有文件的新链接(也称为硬链接(hard link))。还记录了 linkat() 函数,这可能是您更好的选择。

int link(const char *oldpath, const char *newpath);

显然,这不是一个 C# 友好的系统调用(它们很少是)。因此,就从 C# 调用它而言,您可以通过创建必要的步骤从 C# 调用它(转换 .h 常量等)——或者您可以直接从 C 调用 link()/C++ 接口(interface)模块,然后从 C# 代码中调用该接口(interface)。由于 Unix 系统调用不是基于 C++ 的,因此您不会遇到名称重整问题。

要调用外部函数,您可以使用 pinvoke 技术(也包含在 Microsoft 的 .Net 框架中)。复制该引用资料中的所有内容有点太长了,但主要功能非常简单。

使用 DllImport 链接到共享库,并声明您需要的外部函数。例如

[DllImport ("libc.so")]
public static int link(string oldpath, string newpath)

您可能还会发现用 C# 编写的 os 接口(interface)模块将系统调用错误转换为更自然的 C# 异常从长远来看是更好的选择。老实说,链接 .so 文件并调用 Linux 系统调用并不难,您可能会得出结论,与单独的 C/C++ 模块相比,您更喜欢这种方法。

如果您必须将单声道代码迁移到 Windows 平台,使用操作系统接口(interface)模块将简化您的工作。顺便说一句,您也可以在 Windows 上的 NTFS 文件系统上创建硬链接(hard link),但很少有 Windows 用户使用它们,更不用说期望它们了。

最后,真正的答案:Mono.Unix NameSpace是大多数系统调用的不错选择,link() 也不异常(exception)。如果您查看 Mono.Unix.Native 的 SysCall 类,您应该会找到 link() 方法。

using Mono.Unix.Native;
SysCall.Link(ExistingName, NewLinkName);

不幸的是,Mono 文档不使用 RESTful 接口(interface),所以我不能给你直接链接正确的页面。 Start at然后使用树界面向下钻取

我认为在这种情况下,教你钓鱼的答案更合适。您可以下载 mono native 源代码并确切了解 mono 是如何工作的。

注意到 Diego 的评论 - 他的评论回答包含在我的较长回答中。

关于c# - 如何在不直接将参数传递给 ln 实用程序的情况下从应用程序内部创建硬链接(hard link) (Linux)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com