当我使用SSH.NET通过SFTP传输文件时,我观察到一些奇怪的行为。我正在使用SFTP将XML文件传输到另一个服务(我不控制)以进行处理。如果我使用SftpClient.WriteAllBytes
,则服务会投诉该文件无效的XML。如果我先写入一个临时文件,然后使用SftpClient.UploadFile
,则传输成功。
发生了什么?
使用.WriteAllBytes
:
public void Send(string remoteFilePath, byte[] contents)
{
using(var client = new SftpClient(new ConnectionInfo(/* username password etc.*/)))
{
client.Connect();
client.WriteAllBytes(remoteFilePath, contents);
}
}
使用
.UploadFile
:public void Send(string remoteFilePath, byte[] contents)
{
var tempFileName = Path.GetTempFileName();
File.WriteAllBytes(tempFileName, contents);
using(var fs = new FileStream(tempFile, FileMode.Open))
using(var client = new SftpClient(new ConnectionInfo(/* username password etc.*/)))
{
client.Connect();
client.UploadFile(fs, targetPath);
}
}
编辑:
威尔在评论中问我如何将XML转换为字节数组。我不认为这是相关的,但是我还是再次问这个问题...:P
// somewhere else:
// XDocument xdoc = CreateXDoc();
using(var st = new MemoryStream())
{
using(var xw = XmlWriter.Create(st, new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }))
{
xdoc.WriteTo(xw);
}
return st.ToArray();
}
最佳答案
我可以使用NuGet的SSH.NET 2016.0.0重现您的问题。但不适用于2016.1.0-beta1。
检查代码,我可以看到SftpFileStream
(WriteAllBytes
使用什么)始终保持写入相同(开始)的数据。
您似乎正受到以下错误的困扰:
https://github.com/sshnet/SSH.NET/issues/70
虽然错误描述不能清楚地表明这是您的问题,但修复该问题的提交与我发现的问题匹配:
Take into account the offset in SftpFileStream.Write(byte[] buffer, int offset, int count) when not writing to the buffer. Fixes issue #70.
回答您的问题:这些方法的行为确实应该类似。
除了SftpClient.UploadFile
针对上传大量数据进行了优化外,而SftpClient.WriteAllBytes
并非针对上传大量数据进行了优化。因此,底层实现是非常不同的。
另外,SftpClient.WriteAllBytes
不会截断现有文件。重要的是,当您上传的数据少于现有文件的数据时。
关于c# - SftpClient.UploadFile和SftpClient.WriteAllBytes有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44185392/