0

我正在使用下面的代码(WinScp nuget)连接到 Sftp 服务器,它运行良好。我能够列出 Sftp 服务器中存在的文件。

SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Sftp,
    HostName = "tst.tst.tt",
    UserName = "test",
    SshHostKeyFingerprint = "ssh-ed25519 255 xxxxxxxxxxxxxxxxxxxxx=",
    SshPrivateKeyPath = @"D:\tst\key.ppk",
    PrivateKeyPassphrase = "asdfghwetrtert",
};

sessionOptions.AddRawSettings("FSProtocol", "2");

using (Session session = new Session())
{
    session.Open(sessionOptions);

    RemoteDirectoryInfo directory = session.ListDirectory("/home/prod/Input");
    foreach (RemoteFileInfo fileInfo in directory.Files)
    {
        Console.WriteLine(
            "{0} with size {1}, permissions {2} and last modification at {3}",
            fileInfo.Name, fileInfo.Length, fileInfo.FilePermissions,
            fileInfo.LastWriteTime);
    }
}

我在 Sftp 中有一个 zip 文件,是否可以仅从 zip 下载特定文件而不是下载整个 zip 文件?

4

1 回答 1

1

一般来说,技术上可以使用 SFTP 协议从 ZIP 存档中仅下载特定文件。但不适用于 WinSCP,因为它不允许部分下载。

如果您使用另一个允许部分下载的 SFTP 库(如 SSH.NET),您可以使用它首先下载 ZIP 中央目录,使用它来定位存档中的特定文件,然后下载存档的该部分(在压缩形式)并在本地解压缩。但这并不容易,因为您必须深入挖掘 ZIP 存档格式。

作为概念的证明,这里有一个 Python 和 FTP 的类似问题:
在 FTP 服务器上的 zip 文件中获取文件名,而无需下载整个存档
使用 SFTP 会更容易一些,因为 SFTP 允许随机访问远程文件,什么FTP没有。


如果您对服务器有 shell 访问权限,一种更简单的方法是使用 shell 命令在服务器上解压缩文件,然后下载解压缩的文件。

于 2020-06-24T07:40:54.627 回答