如何通过 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
中创建文件的另一个副本而浪费内存。
我需要打开 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
中创建文件的另一个副本而浪费内存。