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

时间:2017-11-30 10:49:01

标签: c# .net xml sftp ssh.net

我需要打开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对象如下所示:

enter image description here

3 个答案:

答案 0 :(得分:3)

请注意:

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);
}

或删除阅读器:

docc.Load(mem);

答案 1 :(得分:1)

虽然@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中创建该文件的另一个副本来浪费内存。

答案 2 :(得分:-1)

试试这个:

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();
}

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