【问题标题】:When uploading memory stream with contents created by csvhelper using SSH.NET to SFTP server, the uploaded file is empty使用 SSH.NET 将包含 csvhelper 创建的内容的内存流上传到 SFTP 服务器时,上传的文件为空
【发布时间】:2020-03-15 10:18:52
【问题描述】:

我正在尝试使用 csvhelper 发送 CSV。但是我发送的时候总是空的。

using (var sftProvider =new SFTProvider(Configuration))
using (var csvProvider=new CSVProvider(Configuration))
using (Stream fileStream = new MemoryStream())
{
    var sftp = sftProvider.SFTPConnection("", "", "");
    var nameFile = "/ethias/"+DateTime.Now.ToString(DateFormatConstants.DATE_FORMAT) + ".csv";
    if (sftp.Exists(nameFile))
    {
        sftProvider.ReadFileSFTP(sftp, nameFile, fileStream);
    } 
    await csvProvider.WriteCsv(new List<EthiasResultDTO>() {ethiasResultDto},fileStream); 
    sftProvider.UploadFileSFTP(sftp,nameFile,fileStream);
}

csv 的代码:

public async Task WriteCsv<T>(List<T> csvInfo, Stream stream)
{
    using(var writer = new StreamWriter(stream, Encoding.UTF8))
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {
        csv.Configuration.Delimiter = ";";

        if ( stream.Length > 0)
        {
            csv.Configuration.HasHeaderRecord = false;
        }
        csv.WriteRecords(csvInfo);
    }
}

我尝试了一些东西,但它总是创建空文件。

【问题讨论】:

  • 进入同一个fileStream,你首先应用ReadFileSFTP(),然后WriteCsv()。我认为您所做的是从 FTP 位置获取文件,将一些记录附加到其中,然后将其放回原处。如果是这种情况,只需设置fileStream.Position = 0;before 将其传递给UploadFileSFTP
  • 如果@OguzOzgul 的建议没有帮助,我们将需要minimal reproducible example。您还没有告诉我们有关 FTP/SFTP 库的任何信息。甚至不清楚您使用的是 FTP 还是 SFTP。
  • 我使用 sftp Renci.SshNet
  • 我只有一个用于 sftp 的通用类
  • 我只在有文件的情况下恢复记录,但我也有问题,当我只创建和广告一个新文件时,csv中的记录为空

标签: c# sftp memorystream csvhelper ssh.net


【解决方案1】:

在写入流后,您必须将流的读取指针返回到开头。例如,这些问题中涵盖了这一点:
Upload data from memory to SFTP server using SSH.NET
Upload from ByteArray/MemoryStream using SSH.NET - File gets created with size 0KB


为此,您还必须确保StreamWriter 不会关闭内存流:
Is there any way to close a StreamWriter without closing its BaseStream?


using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    // Write
}

stream.Position = 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2015-04-06
    • 2023-04-01
    • 2018-11-03
    • 2016-01-28
    • 2018-06-07
    • 2018-07-11
    相关资源
    最近更新 更多