Archived Forum Post

Index of archived forum posts

Question:

SFTP download partial file

Jul 26 '17 at 08:02

Hello, I'm downloading a TXT file via SFTP with command:

success = sftp.DownloadFileByName(remoteFilePath, localFilePath);

and it works but the file is missing of last chars. The log tell me the file is 4488 bytes, but really is 4522. Chilkat logs:

DownloadFileByName:
    DllDate: May 25 2017
    ChilkatVersion: 9.5.0.68
    UnlockPrefix: GLOCALSSH
    Architecture: Little Endian; 64-bit
    Language: .NET 4.5 / x64
    VerboseLogging: 1
    SshVersion: SSH-2.0-SSH
    SftpVersion: 3
    downloadFileByName:
        PreserveDate: 0
        fromFilePath: OUTPUT/AGOPT20170626.TXT
        toFilePath: D:\TEMP\ImportFlussi\OUTPUT\AGOPT20170626.TXT
        fromFilePathUtf8_QP: OUTPUT/AGOPT20170626.TXT
        toFilePathUtf8_QP: D:\TEMP\ImportFlussi\OUTPUT\AGOPT20170626.TXT
        OpenRemoteFile:
            sftpOpenFile:
                filepathUtf8_QP: OUTPUT/AGOPT20170626.TXT
                remotePath: OUTPUT/AGOPT20170626.TXT
                access: readOnly
                createDisposition: openExisting
                v3Flags: 0x1
                sendPacket:
                    channelSendData2:
                        (leaveContext)
                    (leaveContext)
                Sent FXP_OPEN
                readSftpPacket:
                    (leaveContext 93ms)
                handle: 2F4F55545055542F41474F505432303137303632362E545854
                (leaveContext 93ms)
            timeToOpenMs: Elapsed time: 93 millisec
            (leaveContext 93ms)
        FetchRemoteFileAttributes:
            fetchAttributes:
                bFollowLinks: 1
                bIsHandle: 0
                bSizeOnly: 1
                filename: OUTPUT/AGOPT20170626.TXT
                serverVersion: 3
                Using FXP_STAT
                sendPacket:
                    channelSendData2:
                        (leaveContext)
                    (leaveContext 16ms)
                Sent message to fetch attributes.
                readSftpPacket:
                    (leaveContext)
                Received SSH_FXP_ATTRS
                unpackFileAttr_v3:
                    validFlags: 0xd
                    size: 4488
                    permissions: 0x81ff
                    octalPermissions: 100777
                    type: 1
                    lastAccessTime32: 0x59511690
                    lastModifiedTime32: 0x59511690
                    (leaveContext)
                (leaveContext 16ms)
            timeToFetchAttrMs: Elapsed time: 16 millisec
            (leaveContext 16ms)
        remoteFileSize: 4488
        resumeFlag: 0
        openForReadWriteWin32:
            (leaveContext)
        numBytesToDownload: 4488
        soRcvBuf: 4194304
        soSndBuf: 262144
        cryptAlgorithm: aes
        macAlgorithm: SHA-1
        compression: no
        newDownloadLoop:
            offset64: 0
            numBytesToDownload: 4488
            readUntilEnd: 0
            sendFxpRead:
                sendPacket:
                    sendChannelData:
                        (leaveContext)
                    (leaveContext)
                (leaveContext)
            (leaveContext 78ms)
        sftpCloseHandle:
            handle: 2F4F55545055542F41474F505432303137303632362E545854
            sendPacket:
                channelSendData2:
                    (leaveContext)
                (leaveContext)
            Sent FXP_CLOSE
            readSftpPacket:
                (leaveContext 31ms)
            StatusResponseFromServer:
                Request: FXP_CLOSE
                InformationReceivedFromServer:
                    StatusCode: 0
                    StatusMessage: The operation completed
                    (leaveContext)
                (leaveContext)
            (leaveContext 31ms)
        timeToCloseHandleMs: Elapsed time: 31 millisec
        Closing local output file...
        Verifying local output file size...
        localFileSizeAfterDownload: 4488
        expectedFileSizeAfterDownload: 4488
        Good. The local file is the expected size.
        totalTimeMs: Elapsed time: 250 millisec
        (leaveContext 250ms)
    Success.
    (leaveContext 250ms)

Server Logs with filezilla client: 1 Filezilla asks 32768 bytes and get 4522 (really dimension) 2017-06-26 16:17:22,742 [Thread-140] INFO SPXPSshdLoggingListener - Remote client wants 32768 bytes from file at offset 0 localwindow=130817 remotewindow=2147483273 2017-06-26 16:17:22,742 [Thread-140] INFO SpecialLog - SFTPSERVERCMD: (xxxx@/xxxxxxx:50907) readFile /OUTPUT/AGOPT20170626.TXT 2017-06-26 16:17:22,742 [Thread-140] TRACE SFTPVirtualFileSystem - Entering SFTPVirtualFileSystem.readFile: 2017-06-26 16:17:22,742 [Thread-140] TRACE SFTPVirtualFileSystem - fileHandle: 2F4F55545055542F41474F505432303137303632362E545854 offset: 0 buf.length: 32785 start: 13 numBytesToRead: 32768 2017-06-26 16:17:22,742 [Thread-140] TRACE SFTPVirtualFileSystem - Exiting SFTPVirtualFileSystem.readFile: 2017-06-26 16:17:22,742 [Thread-140] TRACE SFTPVirtualFileSystem - SFTPVirtualFileSystem.readFile: Returning 4522 2017-06-26 16:17:22,742 [Thread-140] INFO SPXPSshdLoggingListener - Read 4522 bytes from filesystem …2017-06-26 16:17:23,117 [Thread-140] DEBUG SPXPSshdLoggingListener - SFTP_FILE_DOWNLOAD_COMPLETE| FILE_NAME = /OUTPUT/AGOPT20170626.TXT| SESSION_ID = [B@4f0bb37b| NFS = com.xxxxxxxxx.spxp.sftpserver.filesystem.SFTPVirtualFileSystem@38e07fc8| BYTES_TRANSFERED = 4522 SUCCESS

Serve logs with Chilkat library: 2 ChilkatDotNet45 v.9.5.0.61 asks 4488 bytes and get 4488 (not completed size!) 2017-06-26 16:17:55,211 [Thread-142] INFO SPXPSshdLoggingListener - Remote client wants 4488 bytes from file at offset 0 localwindow=130852 remotewindow=2096701 2017-06-26 16:17:55,211 [Thread-142] INFO SpecialLog - SFTPSERVERCMD: (SPZ-AXEROX@/172.30.193.146:50924) readFile /OUTPUT/AGOPT20170626.TXT 2017-06-26 16:17:55,211 [Thread-142] TRACE SFTPVirtualFileSystem - Entering SFTPVirtualFileSystem.readFile: 2017-06-26 16:17:55,211 [Thread-142] TRACE SFTPVirtualFileSystem - fileHandle: 2F4F55545055542F41474F505432303137303632362E545854 offset: 0 buf.length: 4505 start: 13 numBytesToRead: 4488 2017-06-26 16:17:55,211 [Thread-142] TRACE SFTPVirtualFileSystem - Exiting SFTPVirtualFileSystem.readFile: 2017-06-26 16:17:55,211 [Thread-142] TRACE SFTPVirtualFileSystem - SFTPVirtualFileSystem.readFile: Returning 4488 2017-06-26 16:17:55,211 [Thread-142] INFO SPXPSshdLoggingListener - Read 4488 bytes from filesystem 2017-06-26 16:17:55,258 [Thread-142] DEBUG SPXPSshdLoggingListener - SFTP_FILE_DOWNLOAD_COMPLETE| FILE_NAME = OUTPUT/AGOPT20170626.TXT| SESSION_ID = [B@77c16c5f| NFS = com.xxxxxxxx.spxp.sftpserver.filesystem.SFTPVirtualFileSystem@52e42811| BYTES_TRANSFERED = 4488 SUCCESS


Answer

The problem is SSH (SFTP) server tell to Chilkat wrong file size. So Chilkat download only a part.

A workaround using ReadFileByte could be:

 using (var fs = new FileStream(LocalDestinationFilename, FileMode.Create, FileAccess.Write))
            {
                string handle = sftp.OpenFile(RemoteFileName, "readOnly", "openExisting");
                while (!sftp.Eof(handle))
                {
                    byte[] byteArray = sftp.ReadFileBytes(handle, 131072);

                    fs.Write(byteArray, 0, byteArray.Length);
                }

            }

Answer

Paolo Celoria , could you tell us that you use which sftp server? Thanks.


Answer

Paolo Celoria , you should know so chilkat will adapter it and we will do attention about it.


Answer

I discover that the number of missing chars at the end of file is equal to number of lines of the file. Probably passing from Linux SFTP to Windows (download with chilkat), the LF/CR were added to byte count and the download is stopped before the end! This coul help you? Thanks