目前我們有 C# .NET Framework 4x 應用程式,它將資料從本地資料庫匯出到DataTable記憶體中,然后將其寫入本地 TSV 檔案。然后,TSV 檔案被壓縮并上傳到遠程 https 檔案物件存盤(OpenStack/Rackspace Cloud Files - 類似于Amazon S3)。
計劃是增強此程序,以便我們可以跳過“寫入本地 TSV 和 zip”步驟,而是將記憶體DataTable中的資料流式傳輸或管道輸出到新的遠程檔案目標,該目標將是SFTP服務器(除非我們找到更好的協議/storage 替代方案,適合從記憶體中流式傳輸/管道的特定細節),而無需先寫入本地檔案系統。
對此有什么想法,是否有庫或代碼示例將記憶體DataTable內容寫入打開的遠程 SFTP端點,以便將其視為檔案上傳?或者到不同的遠程端點型別,但仍然寫出DataTable而不首先寫入本地檔案系統?(甚至可以是我們當前的 HTTPS 云檔案或類似S3的端點)
uj5u.com熱心網友回復:
使用 Renci.SshNet 庫從最近拍攝的第一遍中回復答案和示例代碼:
var remoteFilename = "datatable.tsv";
var tsvContent = ConvertDataTableToTSVFormat(dataTable);
using (var sftpClient = new SftpClient(host, Port, username, password))
{
sftpClient.Connect();
sftpClient.BufferSize = 4 * 1024;
using (MemoryStream ms = new MemoryStream())
{
byte[] bytes = Encoding.ASCII.GetBytes(tsvContent);
ms.Write(bytes, 0, bytes.Length);
ms.Seek(0, SeekOrigin.Begin);
ms.Position = 0;
sftpClient.UploadFile(ms, remoteFilename);
}
}
private static string ConvertDataTableToTSVFormat(DataTable dataTable)
{
StringBuilder fileContent = new StringBuilder();
foreach (var col in dataTable.Columns)
{
fileContent.Append(col.ToString() "\t");
}
fileContent.Replace("\t", System.Environment.NewLine, fileContent.Length - 1, 1);
foreach (DataRow dr in dataTable.Rows)
{
foreach (var column in dr.ItemArray)
{
fileContent.Append("\"" column.ToString() "\"\t");
}
fileContent.Replace("\t", System.Environment.NewLine, fileContent.Length - 1, 1);
}
return fileContent.ToString();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/442185.html
上一篇:訪問程式集外部的內部建構式
