我们可以使用C#在FTP服务器中解压缩文件吗?

我可以在FTP中提取ZIP文件,并使用C#将此提取的文件放在同一位置吗?

这是不可能的。

FTP协议中没有API来解压缩服务器上的文件。


但是,除了FTP访问之外,还有一个SSH访问权限并不罕见。 如果是这种情况,您可以连接SSH并在服务器上执行unzip shell命令(或类似命令)来解压缩文件。
请参阅C#发送简单的SSH命令 。

如果需要,您可以使用FTP协议下载提取的文件(虽然如果您具有SSH访问权限,您也将拥有SFTP访问权限。然后,使用SFTP而不是FTP。)。


一些(极少数)FTP服务器提供API以使用SITE EXEC命令(或类似命令)执行任意shell(或其他)命令。 但这真的非常罕见。 您可以像上面的SSH一样使用此API。

通过FTP下载到MemoryStream,然后你可以解压缩,示例显示如何获取流,只需更改到MemoryStream并解压缩。 示例不使用MemoryStream,但如果您熟悉流,那么修改这两个示例对您来说应该是微不足道的。

示例来自: 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","janeDoe@contoso.com"); 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(); } } } 

解压缩流,例如: 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("========================"); } } } } } } 

这是一个从ftp下载zip文件,解压缩该zip文件然后将压缩文件上传回同一个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", "janeDoe@contoso.com"); 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", "janeDoe@contoso.com"); 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; } } } } } } }