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

问题描述 投票:8回答:3

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

c# .net ftp zip
3个回答
17
投票

这是不可能的。

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


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

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


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


3
投票

通过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","[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();    
        }  
    }  
}

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

0
投票

如果您在ftp上传后尝试解压缩文件,则需要运行具有适当权限的服务器端脚本,该脚本可以从c#应用程序或c#ssh中触发,如前所述。

© www.soinside.com 2019 - 2024. All rights reserved.