當我使用SSH.NET與SFTP傳輸文件時,我觀察到一些奇怪的行爲。我正在使用SFTP將XML文件傳輸到另一個服務(我不控制)進行處理。如果我使用SftpClient.WriteAllBytes
服務抱怨該文件不是有效的XML。如果我第一次寫入臨時文件,然後使用SftpClient.UploadFile
,則傳輸成功。SftpClient.UploadFile和SftpClient.WriteAllBytes有什麼區別?
發生了什麼事?
使用.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();
}
我沒有回答你的問題,但是你可以通過使用'MemoryStream'避免在你的第二段中創建一個臨時文件。 – itsme86
看來問題在於如何將xml轉換爲字節數組。你沒有表現出來,所以很難說。首先將它寫入文件可能...以某種方式修復它?搖擺。可能是UploadFile使用了不同的編碼... – Will
@ itsme86:謝謝。在我看到其他人使用它之前,一直在四處搜尋,看看這個問題是否被問到。這是比較可取的,因爲它可以讓我檢查已經發送用於審計/調試目的的文件。 – sconzey