2017-08-29 1 views

Répondre

18

Ce n'est pas possible.

Il n'y a pas d'API dans le protocole FTP pour décocher un fichier sur un serveur. Cependant, il n'est pas rare que l'un, en plus d'un accès FTP, ait aussi un accès SSH. Si c'est le cas, vous pouvez vous connecter avec le SSH et exécuter la commande shell unzip (ou similaire) sur le serveur pour décompresser les fichiers.
Voir C# send a simple SSH command. Si vous avez besoin, vous pouvez télécharger les fichiers extraits en utilisant le protocole FTP (si vous avez l'accès SSH, vous aurez également un accès SFTP, puis utilisez le SFTP au lieu du FTP.).


Certains (très peu) les serveurs FTP offrent une API pour exécuter un shell arbitraire (ou autre) des commandes en utilisant la commande SITE EXEC (ou similaire). Mais c'est vraiment très rare. Vous pouvez utiliser cette API de la même manière que le SSH ci-dessus.

2

Télécharger via FTP à MemoryStream, puis vous pouvez décompresser, l'exemple montre comment obtenir un flux, il suffit de passer à MemoryStream et unzip. L'exemple n'utilise pas MemoryStream mais si vous êtes familier avec les flux, il devrait être trivial de modifier ces deux exemples pour qu'ils fonctionnent pour vous.

exemple de: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-download-files-with-ftp

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace Examples.System.Net 
{ 
    public class WebRequestGetExample 
    { 
     public static void Main() 
     { 
      // Get the object used to communicate with the server. 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm"); 
      request.Method = WebRequestMethods.Ftp.DownloadFile; 

      // This example assumes the FTP site uses anonymous logon. 
      request.Credentials = new NetworkCredential ("anonymous","[email protected]"); 

      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

      Stream responseStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(responseStream); 
      Console.WriteLine(reader.ReadToEnd()); 

      Console.WriteLine("Download Complete, status {0}", response.StatusDescription); 

      reader.Close(); 
      response.Close();  
     } 
    } 
} 
flux décomprimer

, par exemple à partir de: https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-compress-and-extract-files

using System; 
using System.IO; 
using System.IO.Compression; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open)) 
      { 
       using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)) 
       { 
        ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt"); 
        using (StreamWriter writer = new StreamWriter(readmeEntry.Open())) 
        { 
          writer.WriteLine("Information about this package."); 
          writer.WriteLine("========================"); 
        } 
       } 
      } 
     } 
    } 
} 

ici est un exemple de travail de télécharger le fichier zip de ftp, décompresser ce fichier zip puis de télécharger le comprimé fichiers dans le même répertoire ftp

using System.IO; 
using System.IO.Compression; 
using System.Net; 
using System.Text; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string location = @"ftp://localhost"; 
      byte[] buffer = null; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       FtpWebRequest fwrDownload = (FtpWebRequest)WebRequest.Create($"{location}/test.zip"); 
       fwrDownload.Method = WebRequestMethods.Ftp.DownloadFile; 
       fwrDownload.Credentials = new NetworkCredential("anonymous", "[email protected]"); 

       using (FtpWebResponse response = (FtpWebResponse)fwrDownload.GetResponse()) 
       using (Stream stream = response.GetResponseStream()) 
       { 
        //zipped data stream 
        //https://stackoverflow.com/a/4924357 
        byte[] buf = new byte[1024]; 
        int byteCount; 
        do 
        { 
         byteCount = stream.Read(buf, 0, buf.Length); 
         ms.Write(buf, 0, byteCount); 
        } while (byteCount > 0); 
        //ms.Seek(0, SeekOrigin.Begin); 
        buffer = ms.ToArray(); 
       } 
      } 

      //include System.IO.Compression AND System.IO.Compression.FileSystem assemblies 
      using (MemoryStream ms = new MemoryStream(buffer)) 
      using (ZipArchive archive = new ZipArchive(ms, ZipArchiveMode.Update)) 
      { 
       foreach (ZipArchiveEntry entry in archive.Entries) 
       { 
        FtpWebRequest fwrUpload = (FtpWebRequest)WebRequest.Create($"{location}/{entry.FullName}"); 
        fwrUpload.Method = WebRequestMethods.Ftp.UploadFile; 
        fwrUpload.Credentials = new NetworkCredential("anonymous", "[email protected]"); 

        byte[] fileContents = null; 
        using (StreamReader sr = new StreamReader(entry.Open())) 
        { 
         fileContents = Encoding.UTF8.GetBytes(sr.ReadToEnd()); 
        } 

        if (fileContents != null) 
        { 
         fwrUpload.ContentLength = fileContents.Length; 

         try 
         { 
          using (Stream requestStream = fwrUpload.GetRequestStream()) 
          { 
           requestStream.Write(fileContents, 0, fileContents.Length); 
          } 
         } 
         catch(WebException e) 
         { 
          string status = ((FtpWebResponse)e.Response).StatusDescription; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

mais après avoir décompressé dans le flux de mémoire, je dois le télécharger sur ftp droite? En fait, je veux tout cela fait dans une seule requête ftp .. – Nithin

+0

semble que vous avez un processus en trois étapes? 1. télécharger via ftp, 2. décompresser, 3. télécharger via ftp? est-ce la commande que vous recherchez? J'ai donné deux exemples sur la façon de télécharger d'abord via ftp et deuxième comment décompresser. Laissez-moi adapter la réponse avec quelque chose de plus spécifique, oui? –

+0

Je sais que l'exemple n'est pas 'parfait' mais cela fonctionne –