使用 SSH.NET (VB.NET) 将文件下载到字节数组
Download file to byte array using SSH.NET (VB.NET)
我想使用 SSH.NET 库从 SFTP 下载文件。但是,我希望在 Byte
数组中接收此文件。因此,这个文件必须存储在内存中。
这是我的做法
Sub Main()
Dim client As SftpClient = New SftpClient(hostname, username, password)
client.Connect()
Using b As System.IO.Stream = client.OpenRead("/www/Server.exe")
Dim data() As Byte = GetStreamAsByteArray(b)
End Using
End Sub
Public Shared Function GetStreamAsByteArray(ByVal stream As System.IO.Stream) As Byte()
Dim streamLength As Integer = Convert.ToInt32(stream.Length)
Dim fileData As Byte() = New Byte(streamLength) {}
' Read the file into a byte array
stream.Read(fileData, 0, streamLength)
stream.Flush()
stream.Close()
Return fileData
End Function
不过这个方法不行:确实,写到磁盘上测试了一下,已经损坏了。
我认为您的代码或多或少是正确的。唯一的问题是,在 VB.NET 中,New Byte(X)
确实分配了一个比您想要的长一个字节的数组:0..X
(不是 1..X
或 0..X-1
,因为您可能已经预料到了)。
因此,如果您随后保存完整数组(例如 File.WriteAllBytes
),而不仅仅是 stream.Length
字节,文件将大一个字节,并带有一个额外的尾随 NULL 字节。
这是正确的:
Dim fileData As Byte() = New Byte(streamLength - 1) {}
我想使用 SSH.NET 库从 SFTP 下载文件。但是,我希望在 Byte
数组中接收此文件。因此,这个文件必须存储在内存中。
这是我的做法
Sub Main()
Dim client As SftpClient = New SftpClient(hostname, username, password)
client.Connect()
Using b As System.IO.Stream = client.OpenRead("/www/Server.exe")
Dim data() As Byte = GetStreamAsByteArray(b)
End Using
End Sub
Public Shared Function GetStreamAsByteArray(ByVal stream As System.IO.Stream) As Byte()
Dim streamLength As Integer = Convert.ToInt32(stream.Length)
Dim fileData As Byte() = New Byte(streamLength) {}
' Read the file into a byte array
stream.Read(fileData, 0, streamLength)
stream.Flush()
stream.Close()
Return fileData
End Function
不过这个方法不行:确实,写到磁盘上测试了一下,已经损坏了。
我认为您的代码或多或少是正确的。唯一的问题是,在 VB.NET 中,New Byte(X)
确实分配了一个比您想要的长一个字节的数组:0..X
(不是 1..X
或 0..X-1
,因为您可能已经预料到了)。
因此,如果您随后保存完整数组(例如 File.WriteAllBytes
),而不仅仅是 stream.Length
字节,文件将大一个字节,并带有一个额外的尾随 NULL 字节。
这是正确的:
Dim fileData As Byte() = New Byte(streamLength - 1) {}