如何通过 SFTP 下载并打开 XML 文件?

How to download and open XML file via SFTP?

我需要打开 XML 文件(创建 XmlDocument)而不创建本地副本。使用 SSH.NET,我想出了这个代码:

var connectionInfo = new ConnectionInfo("host",
    "username",
    new PasswordAuthenticationMethod("username", "password"));

using (var client = new SftpClient(connectionInfo))
{
    client.Connect();

    System.IO.MemoryStream mem = new System.IO.MemoryStream();

    client.DownloadFile("filename.xml", mem);

    mem.Position=0;

    using(XmlReader reader = XmlReader.Create(mem))
    {
        var docc = new XmlDocument();
        docc.Load(mem);
    }

    client.Disconnect();
}

但是卡在了 docc.Load(mem)。可能是什么问题?

mem 对象如下所示:

您似乎将 xml 文件写入流,现在,流指向 xml 文件的末尾。尝试在加载前将 stream.position 设置为 0。

stream.Position = 0;

试试这个:

using (var client = new SftpClient(connectionInfo))
{
    client.Connect();

    System.IO.MemoryStream mem = new System.IO.MemoryStream();

    client.DownloadFile("filename.xml", mem);
    // Set stream position
    mem.Position = 0;
    using(XmlReader reader = XmlReader.Create(mem))
    {
        var docc = new XmlDocument();
        docc.Load(mem);
    }

    client.Disconnect();
}

我还会更改代码以正确处理内存流...

这里注意:

using(XmlReader reader = XmlReader.Create(mem))
{
    var docc = new XmlDocument();
    docc.Load(mem);
}

您根本没有使用变量 reader。要么改成

using(XmlReader reader = XmlReader.Create(mem))
{
    var docc = new XmlDocument();
    docc.Load(reader);
}

或完全删除 reader:

docc.Load(mem);

虽然@Evk 的回答解决了您眼前的问题,但您的代码仍然效率低下。

使用SftpClient.OpenRead直接将文件串流到XmlReader:

using (XmlReader reader = XmlReader.Create(client.OpenRead("filename.xml"))
{
    // process the XML
}

XmlDocument:

var docc = new XmlDocument();
docc.Load(client.OpenRead("filename.xml"));

这样,您就不会在 MemoryStream 中创建文件的另一个副本而浪费内存。