gpt4 book ai didi

c# - Renci SSH.NET : can create symlink, 但删除符号链接(symbolic link)失败,为什么?

转载 作者:行者123 更新时间:2023-12-02 14:33:31 24 4
gpt4 key购买 nike

我目前正在尝试使用 Renci SSH.NET 将文件复制到使用 SFTP 的 Unix 服务器,此外,我想创建一个指向已复制文件的符号链接(symbolic link)。这基本上是我的代码的样子,注意变量 sftpSftpClient 的工作实例:

string symlinkSource = @"/msyerver/SymSource/Test001"; //source to link to, exists
string newPath = @"/msyerver/somedirectory/Test001"; //place where the symlink should be created
sftp.SymbolicLink(symlinkSource, newPath); //link newPath to symlinkSource, works!
sftp.Delete(newPath); //fails with exception!

问题是:如何正确删除符号链接(symbolic link)?请注意:我只想删除指向文件夹 Test001 的链接,而不是引用的文件夹本身。为什么这不起作用?不幸的是,SSH.NET 没有抛出有意义的异常,我得到的唯一文本是“失败”,并且由于这在内部通过一些“请求”机制起作用,所以我无法调试问题的确切来源。

当我查看异常时,我发现: Data: {System.Collections.ListDictionaryInternal}
很明显,看起来 SSH.NET 正在尝试删除链接的文件夹。我想要的是删除符号链接(symbolic link)本身,而不是后面的文件夹。

最佳答案

确实,SftpClient.Delete 的方式(和 SftpClient.DeleteFile )已实现,它们无法删除符号链接(symbolic link)。他们首先调用SftpSession.GetCanonicalPath与路径,什么解决了链接。因此,您实际上是在尝试删除链接目标而不是链接本身,由于某种原因失败了。

无法使用 SSH.NET API 删除链接本身。

虽然通过一些反射黑客你可以绕过 SftpSession.GetCanonicalPath称呼:

public static class SftpClientExtensions
{
public static void DeleteLink(this SftpClient client, string path)
{
Type sftpClientType = client.GetType();
FieldInfo sftpSessionField = sftpClientType.GetField("_sftpSession", BindingFlags.NonPublic | BindingFlags.Instance);
object sftpSession = sftpSessionField.GetValue(client);
Type sftpSessionType = sftpSession.GetType();
MethodInfo requestRemoveMethod = sftpSessionType.GetMethod("RequestRemove", BindingFlags.NonPublic | BindingFlags.Instance);
requestRemoveMethod.Invoke(sftpSession, new object[] { path });
}
}

使用上述扩展方法,您现在可以使用:
sftp.DeleteLink(newPath);

更好的办法是获取 SSH.NET 源代码的副本并将方法直接添加到 SftpClient类(class)。并向 SSH.NET project 提出请求支持删除链接。

关于c# - Renci SSH.NET : can create symlink, 但删除符号链接(symbolic link)失败,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37314258/

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