【问题标题】:Upload a folder to a directory server将文件夹上传到目录服务器
【发布时间】:2011-10-28 16:41:58
【问题描述】:

我想将保持相同结构(文件夹、子文件夹..)的整个文件夹上传到远程服务器。有必要迭代所有文件夹还是可以获取文件夹并上传到服务器?

我可以上传单个文件,但我认为文件夹的策略可能(肯定)不同。

有什么建议吗?

谢谢

编辑:是远程服务器

【问题讨论】:

    标签: c# c#-4.0 file-upload upload geoserver


    【解决方案1】:

    我不确定这是否是您要查找的内容,但有时上传压缩文件夹(具有低压缩级别)并在服务器上解压缩它可能会更容易,如果您可以在客户端进行管理的话。如果它适用于您,您可以使用免费的 .net zip 库,例如 SharpZipLib,因此您不必自己编写压缩程序。

    这也是使用 thr SharZipLib 压缩/解压缩文件夹的类:

    using System;
    using System.Collections;
    using System.IO;
    using ICSharpCode.SharpZipLib.Zip;
    
    namespace ENSI.Releaser.Code
    {
        public class ZipUtility
        {
            public void ZipFiles(string inputFolderPath, string outputPathAndFile, string     password)
        {
            ArrayList ar = GenerateFileList(inputFolderPath); // generate file list
            int trimLength = (Directory.GetParent(inputFolderPath)).ToString().Length;
            // find number of chars to remove     // from orginal file path
            trimLength += 1; //remove '\'
            FileStream ostream;
            byte[] obuffer;
            string outPath = inputFolderPath + @"\" + outputPathAndFile;
            var oZipStream = new ZipOutputStream(File.Create(outPath)); // create zip stream
            if (!string.IsNullOrEmpty(password))
                oZipStream.Password = password;
            oZipStream.SetLevel(9); // maximum compression
            ZipEntry oZipEntry;
            foreach (string fil in ar) // for each file, generate a zipentry
            {
                oZipEntry = new ZipEntry(fil.Remove(0, trimLength));
                oZipStream.PutNextEntry(oZipEntry);
    
                if (!fil.EndsWith(@"/")) // if a file ends with '/' its a directory
                {
                    ostream = File.OpenRead(fil);
                    obuffer = new byte[ostream.Length];
                    ostream.Read(obuffer, 0, obuffer.Length);
                    oZipStream.Write(obuffer, 0, obuffer.Length);
                }
            }
            oZipStream.Finish();
            oZipStream.Close();
        }
    
        private ArrayList GenerateFileList(string dir)
        {
            var fils = new ArrayList();
            bool Empty = true;
            foreach (string file in Directory.GetFiles(dir)) // add each file in directory
            {
                fils.Add(file);
                Empty = false;
            }
    
            if (Empty)
            {
                if (Directory.GetDirectories(dir).Length == 0)
                // if directory is completely empty, add it
                {
                    fils.Add(dir + @"/");
                }
            }
    
            foreach (string dirs in Directory.GetDirectories(dir)) // recursive
            {
                foreach (object obj in GenerateFileList(dirs))
                {
                    fils.Add(obj);
                }
            }
            return fils; // return file list
        }
    
        public void UnZipFiles(string zipPathAndFile, string outputFolder, string password, bool deleteZipFile)
        {
            var s = new ZipInputStream(File.OpenRead(zipPathAndFile));
            if (!string.IsNullOrEmpty(password))
                s.Password = password;
            ZipEntry theEntry;
            string tmpEntry = String.Empty;
            while ((theEntry = s.GetNextEntry()) != null)
            {
                string directoryName = outputFolder;
                string fileName = Path.GetFileName(theEntry.Name);
                // create directory 
                if (directoryName != "")
                {
                    Directory.CreateDirectory(directoryName);
                }
                if (fileName != String.Empty)
                {
                    if (theEntry.Name.IndexOf(".ini") < 0)
                    {
                        string fullPath = directoryName + "\\" + theEntry.Name;
                        fullPath = fullPath.Replace("\\ ", "\\");
                        string fullDirPath = Path.GetDirectoryName(fullPath);
                        if (!Directory.Exists(fullDirPath)) Directory.CreateDirectory(fullDirPath);
                        FileStream streamWriter = File.Create(fullPath);
                        int size = 2048;
                        byte[] data = new byte[size];
                        while (true)
                        {
                            size = s.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                streamWriter.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        }
                        streamWriter.Close();
                    }
                }
            }
            s.Close();
            if (deleteZipFile)
                File.Delete(zipPathAndFile);
        }
    }
    }
    

    【讨论】:

    • 我正在使用你的代码,但是当我解决这个问题时,我遇到了 url 或访问文件夹的问题(访问被拒绝)我会告诉你
    【解决方案2】:

    如果我正确理解您的问题,您可以:

    A) 在服务器上重新创建文件夹结构并将文件移动到那里

    B) 压缩您的根文件夹,将其移动到服务器并解压缩。

    【讨论】:

    • 我认为 B 可能是一个不错的选择,但我不知道这是最好的方法
    • @JMG 我认为 danyloid 提供的解决方案可能是一个不错的选择。我的意思是使用 SharpZipLib。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多