c#是否可以从sftp中存在的zip文件下载特定文件

c# Is it possible to download a particular file from a zip file present in sftp

我正在使用以下代码 (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 文件?

一般来说,使用 SFTP 协议从 ZIP 压缩文件中下载特定文件在技术上是可行的。但 WinSCP 不行,因为它不允许部分下载。

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

作为概念的证明,这里是 Python 和 FTP 的类似问题:

使用 SFTP 会更容易一些,因为 SFTP 允许随机访问远程文件,而 FTP 则不允许。


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