c# – SftpClient.UploadFile和SftpClient.WriteAllBytes有什么
当我使用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); } } 编辑: // 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使用的东西)始终保持写入相同(起始)的数据. 看来你正在遭受这个bug: 虽然错误描述并不清楚它是你的问题,修复它的提交符合我发现的问题: 回答你的问题:这些方法确实应该表现得相似. 除了SftpClient.UploadFile针对大量数据的上传进行了优化,而SftpClient.WriteAllBytes则没有.所以底层实现是非常不同的. 此外,SftpClient.WriteAllBytes不会截断现有文件.重要的是,当您上传的数据少于现有文件时. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |