c # Можно ли загрузить конкретный файл из zip-файла, присутствующего в 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);
    }
}

У меня есть zip-файл в Sftp. Можно ли загрузить из zip только конкретный файл вместо загрузки всего zip-файла?


person Pரதீப்    schedule 24.06.2020    source источник
comment
Если у вас есть оболочка, я рекомендую разархивировать на стороне файлового сервера, а затем загрузить ее.   -  person Llama    schedule 24.06.2020


Ответы (1)


В общем, технически возможно загрузить только определенный файл из ZIP-архива по протоколу SFTP. Но не с WinSCP, так как он не позволяет частичную загрузку.

Если вы используете другую библиотеку SFTP, которая разрешает частичную загрузку (например, SSH.NET), вы можете использовать ее, чтобы сначала загрузить центральный каталог ZIP, использовать его для поиска определенного файла в архиве, а затем загрузить эту часть архива (в сжатая форма) и распаковать локально. Но это непросто, так как вам придется копаться на низком уровне в формате ZIP-архива.

В качестве доказательства концепции вот аналогичный вопрос для Python и FTP:
Получить имена файлов внутри zip-файла на FTP-сервере. без загрузки всего архива
С SFTP это было бы немного проще, поскольку SFTP позволяет произвольный доступ к удаленному файлу, чего не делает FTP.


Более простой способ, если у вас есть доступ к серверу через оболочку, - это распаковать файл на сервере с помощью команды оболочки, а затем загрузить извлеченный файл.

person Martin Prikryl    schedule 24.06.2020