从另一个线程读取 WinSCP Session.GetFile 流时读取输入流时出错

问题描述 投票:0回答:1

我遇到了这个奇怪的错误;已经调试了一段时间,我认为问题是我正在从一个无意义的网站流式传输幽灵文件。

看一下,这是错误信息:

错误:错误:WinSCP.SessionRemoteException:从远程复制文件 侧面失败了。读取输入流时出错。在 WinSCP.Session.PutFile(Stream 中的 WinSCP.OperationResultBase.Check() 流、字符串remoteFilePath、TransferOptions 选项)

我正在尝试从此站点获取最新文件:

/origin/path/interfaces
,复制该文件并将其粘贴到不同的服务器中,特别是在此位置:
/destination/path/interfaces

一切似乎都正常,我正在获取最新文件,但有些东西对我来说看起来很奇怪:

它似乎正在从这里读取文件:

/origin/path/interfaces/TXTFILES202104101700.txt
(在第一个会话中),但很奇怪,因为我无法通过在站点中指定文件名来访问文件,我只能这样做:
/origin/path/interfaces/
.

我猜这个错误是因为它试图将一个幽灵文件粘贴到新服务器中,它正在从这个位置“读取”

/origin/path/interfaces/TXTFILES202104101700.txt
。我无法在路线中指定文件,只是这样:
/origin/path/interfaces/


这是我的代码:

// Sessions options
SessionOptions SftpSource = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx
};

SessionOptions SftpDestination = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx,
    xxxxxxxx = xxxxxxxxxxxxx
};

using (Session sftpSessionServer1 = new Session())
using (Session SftpSessionServer2 = new Session())
{
    // Connecting to SFTP first server
    sftpSessionServer1.Open(SftpSource);

    // Get list of files in the SFTP directory
    string SftpRemoteDirectory = "/origin/path/interfaces";
    RemoteDirectoryInfo directoryInfo =
        sftpSessionServer1.ListDirectory(SftpRemoteDirectory);

    // Select the most recent file
    RemoteFileInfo ultimateFile =
        directoryInfo.Files
            .Where(file => !file.IsDirectory)
            .OrderByDescending(file => file.LastWriteTime)
            .First();

    // Connecting to SFTP second server
    SftpSessionServer2.Open(SftpDestination);

    string sSftpRemoteDirectory = "/destination/path/interfaces";
    string sftpRemotePath =
        RemotePath.Combine(sSftpRemoteDirectory, ultimateFile.Name);

    // Transfer from SFTP to SFTP
    using (Stream downloadStream = sftpSessionServer1.GetFile(ultimateFile.FullName))
    {
        SftpSessionServer2.PutFile(downloadStream, sftpRemotePath);
    }
}

两个会话的日志:

第一节:

< 2021-04-18 03:35:59.731 Script: -rw-r--r--   1 myuser  oinstall   1609790 Apr 10 22:56:27 2021 TXTFILES202104101700.txt
< 2021-04-18 03:35:59.731 Script: -rw-r--r--   1 myuser  oinstall       435 Feb 12 17:10:58 2021 TXTFILES202102121710.txt
< 2021-04-18 03:35:59.731 Script: -rw-r--r--   1 myuser  oinstall   3722440 Apr 12 10:48:20 2018 TXTFILES20180412.txt
< 2021-04-18 03:35:59.731 Script: -rw-r--r--   1 myuser  oinstall    890092 Dec 20 10:58:54 2018 TXTFILES20181220.txt
> 2021-04-18 03:36:04.032 Script: get  -nopermissions -preservetime -transfer="binary" -onlyfile -- "/origin/path/interfaces/TXTFILES202104101700.txt" "-"
. 2021-04-18 03:36:04.033 Listing file "/origin/path/interfaces/TXTFILES202104101700.txt".
> 2021-04-18 03:36:04.033 Type: SSH_FXP_LSTAT, Size: 68, Number: 1543
< 2021-04-18 03:36:04.049 Type: SSH_FXP_STATUS, Size: 24, Number: 1284
. 2021-04-18 03:36:04.049 Discarding reserved response
< 2021-04-18 03:36:04.059 Type: SSH_FXP_ATTRS, Size: 37, Number: 1543
. 2021-04-18 03:36:04.059 TXTFILES202104101700.txt;-;1609790;2021-04-11T01:56:27.000Z;3;"" [501];"" [503];rw-r--r--;0
. 2021-04-18 03:36:04.059 Copying 1 files/directories to local directory "" - total size: 1.609.790
. 2021-04-18 03:36:04.059   PrTime: Yes; PrRO: No; Rght: rw-r--r--; PrR: No (No); FnCs: N; RIC: 0100; Resume: S (102400); CalcS: No; Mask: *.*
. 2021-04-18 03:36:04.059   TM: B; ClAr: No; RemEOF: No; RemBOM: No; CPS: 0; NewerOnly: No; EncryptNewFiles: Yes; ExcludeHiddenFiles: No; ExcludeEmptyDirectories: No; InclM: ; ResumeL: 0
. 2021-04-18 03:36:04.059   AscM: *.*html; *.htm; *.txt; *.php; *.php3; *.cgi; *.c; *.cpp; *.h; *.pas; *.bas; *.tex; *.pl; *.js; .htaccess; *.xtml; *.css; *.cfg; *.ini; *.sh; *.xml
. 2021-04-18 03:36:04.060 File: '/origin/path/interfaces/TXTFILES202104101700.txt' [2021-04-11T01:56:27.000Z] [1609790]
. 2021-04-18 03:36:04.060 Streaming "/origin/path/interfaces/TXTFILES202104101700.txt" to local machine started.
. 2021-04-18 03:36:04.060 Binary transfer mode selected.
. 2021-04-18 03:36:04.060 Opening remote file.
> 2021-04-18 03:36:04.060 Type: SSH_FXP_OPEN, Size: 76, Number: 1795
< 2021-04-18 03:36:04.073 Type: SSH_FXP_HANDLE, Size: 13, Number: 1795
> 2021-04-18 03:36:04.073 Type: SSH_FXP_FSTAT, Size: 13, Number: 2056
< 2021-04-18 03:36:04.085 Type: SSH_FXP_ATTRS, Size: 37, Number: 2056
> 2021-04-18 03:36:04.085 Type: SSH_FXP_READ, Size: 25, Number: 2309
< 2021-04-18 03:36:04.930 Status code: 1
. 2021-04-18 03:36:04.930 132 skipped SSH_FXP_WRITE, SSH_FXP_READ, SSH_FXP_DATA and SSH_FXP_STATUS packets.
> 2021-04-18 03:36:04.930 Type: SSH_FXP_CLOSE, Size: 13, Number: 23300
< 2021-04-18 03:36:04.930 Type: SSH_FXP_STATUS, Size: 28, Number: 15365
< 2021-04-18 03:36:04.930 Type: SSH_FXP_STATUS, Size: 28, Number: 15621
< 2021-04-18 03:36:04.930 Type: SSH_FXP_STATUS, Size: 28, Number: 15877
< 2021-04-18 03:36:04.930 Type: SSH_FXP_STATUS, Size: 28, Number: 16133
< 2021-04-18 03:36:04.930 Type: SSH_FXP_STATUS, Size: 28, Number: 16389
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 16645
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 16901
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 17157
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 17413
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 17669
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 17925
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 18181
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 18437
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 18693
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 18949
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 19205
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 19461
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 19717
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 19973
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 20229
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 20485
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 20741
< 2021-04-18 03:36:04.931 Type: SSH_FXP_STATUS, Size: 28, Number: 20997
< 2021-04-18 03:36:04.932 Type: SSH_FXP_STATUS, Size: 28, Number: 21253
< 2021-04-18 03:36:04.932 Type: SSH_FXP_STATUS, Size: 28, Number: 21509
< 2021-04-18 03:36:04.932 Type: SSH_FXP_STATUS, Size: 28, Number: 21765
< 2021-04-18 03:36:04.932 Type: SSH_FXP_STATUS, Size: 28, Number: 22021
< 2021-04-18 03:36:04.932 Type: SSH_FXP_STATUS, Size: 28, Number: 22277
< 2021-04-18 03:36:05.000 Type: SSH_FXP_STATUS, Size: 28, Number: 22533
< 2021-04-18 03:36:05.012 Type: SSH_FXP_STATUS, Size: 28, Number: 22789
< 2021-04-18 03:36:05.100 Type: SSH_FXP_STATUS, Size: 28, Number: 23045
. 2021-04-18 03:36:05.100 Transfer done: '/origin/path/interfaces/TXTFILES202104101700.txt' => '-' [1609790]
. 2021-04-18 03:36:05.101 Copying finished: Transferred: 1.609.790, Elapsed: 0:00:01, CPS: 1.684.869/s
> 2021-04-18 03:36:06.027 Script: exit
. 2021-04-18 03:36:06.028 Script: Exit code: 0
. 2021-04-18 03:36:06.028 Closing connection.
. 2021-04-18 03:36:06.028 Sending special code: 1
. 2021-04-18 03:36:06.040 Session sent command exit status 0
. 2021-04-18 03:36:06.040 Main session channel closed
. 2021-04-18 03:36:06.040 All channels closed

第二场:

"/origin/path/interfaces/TXTFILES202104101700.txt"
. 2021-04-18 03:36:04.244 Copying 1 files/directories to remote directory "/destination/path/interfaces/" - total size: 0
. 2021-04-18 03:36:04.244   PrTime: Yes; PrRO: No; Rght: rw-r--r--; PrR: No (No); FnCs: N; RIC: 0100; Resume: S (102400); CalcS: No; Mask: TXTFILES202104101700.txt
. 2021-04-18 03:36:04.244   TM: B; ClAr: No; RemEOF: No; RemBOM: No; CPS: 0; NewerOnly: No; EncryptNewFiles: Yes; ExcludeHiddenFiles: No; ExcludeEmptyDirectories: No; InclM: ; ResumeL: 0
. 2021-04-18 03:36:04.244   AscM: *.*html; *.htm; *.txt; *.php; *.php3; *.cgi; *.c; *.cpp; *.h; *.pas; *.bas; *.tex; *.pl; *.js; .htaccess; *.xtml; *.css; *.cfg; *.ini; *.sh; *.xml
. 2021-04-18 03:36:04.244 File: 'TXTFILES202104101700.txt' [n/a] [0]
. 2021-04-18 03:36:04.244 Streaming "TXTFILES202104101700.txt" to remote directory started.
. 2021-04-18 03:36:04.244 Binary transfer mode selected.
. 2021-04-18 03:36:04.244 Opening remote file.
> 2021-04-18 03:36:04.244 Type: SSH_FXP_OPEN, Size: 84, Number: 259
< 2021-04-18 03:36:04.301 Type: SSH_FXP_HANDLE, Size: 13, Number: 259
> 2021-04-18 03:36:04.321 Type: SSH_FXP_WRITE, Size: 32761, Number: 774
. 2021-04-18 03:36:05.446 53 skipped SSH_FXP_WRITE, SSH_FXP_READ, SSH_FXP_DATA and SSH_FXP_STATUS packets.
> 2021-04-18 03:36:05.446 Type: SSH_FXP_CLOSE, Size: 13, Number: 7684
< 2021-04-18 03:36:05.457 Type: SSH_FXP_STATUS, Size: 24, Number: 7684
< 2021-04-18 03:36:05.457 Status code: 0
> 2021-04-18 03:36:05.457 Type: SSH_FXP_REMOVE, Size: 68, Number: 7949
< 2021-04-18 03:36:05.469 Type: SSH_FXP_STATUS, Size: 24, Number: 7949
< 2021-04-18 03:36:05.469 Status code: 0
* 2021-04-18 03:36:05.469 (ECommand) **Copying files from remote side failed**
* 2021-04-18 03:36:05.469 Failure reading network stream.
. 2021-04-18 03:36:05.470 Script: Failed
> 2021-04-18 03:36:05.924 Script: exit
. 2021-04-18 03:36:05.925 Increasing send buffer from 262144 to 524288
. 2021-04-18 03:36:05.925 Script: Exit code: 1
. 2021-04-18 03:36:05.925 Closing connection.
. 2021-04-18 03:36:05.925 Sending special code: 1
. 2021-04-18 03:36:05.937 Session sent command exit status 0
. 2021-04-18 03:36:05.937 Main session channel closed
. 2021-04-18 03:36:05.937 All channels closed

我该如何解决这个问题?我有点迷失了。

c# .net winscp winscp-net
1个回答
2
投票

确实,有一个错误导致代码无法工作

请升级到WinSCP最新版本。


在修复发布之前,如果文件不是太大,您可以通过将文件复制到内存缓冲区来临时解决该问题:

// Transfer from SFTP to SFTP
using (Stream downloadStream = sftpSessionServer1.GetFile(ultimateFile.FullName))
using (Stream memoryStream = new MemoryStream())
{
    downloadStream.CopyTo(memoryStream);
    memoryStream.Position = 0;
    SftpSessionServer2.PutFile(memoryStream, sftpRemotePath);
}

如果文件较大,您需要先将其下载到本地临时文件,然后再上传。

© www.soinside.com 2019 - 2024. All rights reserved.