【问题标题】:How to download and open XML file via SFTP?如何通过 SFTP 下载和打开 XML 文件?
【发布时间】:2017-11-30 10:49:01
【问题描述】:

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

【问题讨论】:

  • 请注意,您的XmlReader 未被使用。要么做docc.Load(reader);要么完全删除xml阅读器。
  • @Evk 这对我来说是一个非常愚蠢的错误,改为docc.Load(reader) 解决了这个问题。请作为答案发布,以便我接受。

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


【解决方案1】:

注意这里:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      stream.Position = 0;
      

      【讨论】:

        【解决方案4】:

        试试这个:

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

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

        【讨论】:

        • 流中有数据吗?它的长度是多少?
        • @NikaGamkrelidze 位置不为0。你设置了吗?
        猜你喜欢
        • 2020-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 2015-09-08
        • 2021-10-15
        相关资源
        最近更新 更多