- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用 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/
我正在使用以下代码: File.WriteAllBytes("c:\\test.xml", Encoding.UTF8.GetBytes("THIS IS A TEST")) 理论上应该写一个 UTF
我在 myObject.PdfFile 中将 pdf 文件作为字节数组,我正在尝试使用写入所有字节将其保存在硬盘中 System.IO.File.WriteAllBytes(@"C:\a.pdf",
我使用 File.WriteAllBytes创建文件“somefile.txt”。这是否意味着当 File.WriteAllBytes 从执行返回时,传递给 File.WriteAllBytes 的字
我有一段像这样的简单代码: File.WriteAllBytes(Path.Combine(temp, node.Name), stuffFile.Read(0, node.FileHeader.Fi
可以用进度条显示进度吗 File.WriteAllBytes(file, array) 在 C# 中? 最佳答案 没有。 您需要使用循环以 block 的形式写入字节。像下面这样的东西应该让你开始。请
目前正在 Windows 7 上的 Visual Studio 2010 .NET 4 中开发 C# WinForms 应用程序。 首先,我使用 File.ReadAllBytes() 方法从文件中读
File.WriteAllBytes 和 FileStream.Write/WriteBytes 有什么区别?我有一个位图对象,我想在磁盘上创建一个新的 bmp/jpg/png。我想我在某处读到 Wr
当我使用 SSH.NET 通过 SFTP 传输文件时,我观察到一些奇怪的行为。我正在使用 SFTP 将 XML 文件传输到另一个服务(我不控制)进行处理。如果我使用 SftpClient.WriteA
我正在将错误日志写入脚本存在的同一目录中的文件中。我想在写入时潜在地创建一个新文件夹,并将日期/时间添加到文件名中,这样它们 2nd 就不会保存在第一个上。 这是我目前所拥有的: File.Write
我正在尝试将表示完整文件的 Byte[] 数组写入文件。此文件可能具有 .csv 或 .db 扩展名。 我已经建立了一个基于 MSDN 同步套接字的同步客户端和服务器应用程序 通过 S.O 搜索后,我
这个问题在这里已经有了答案: Why can't I use System.IO.File methods in an MVC controller? (1 个回答) 关闭 6 年前。 我正在尝试创
我是一名优秀的程序员,十分优秀!