将文件夹上载到目录服务器

时间:2011-08-17 07:42:32

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

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

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

有什么建议吗?

谢谢

编辑:是远程服务器

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你可以:

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

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

答案 1 :(得分:0)

我不确定这是您要找的内容,但有时上传压缩文件夹(压缩级别较低)并在服务器上解压缩可能会更容易,如果您可以在客户端进行管理。如果它适用于您,您可以使用免费的.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);
    }
}
}