0

同じ構造 (フォルダー、サブフォルダーなど) を保持しているフォルダー全体をリモート サーバーにアップロードしたいと考えています。すべてのフォルダを反復する必要がありますか、それともフォルダを取得してサーバーにアップロードできますか?

単一のファイルをアップロードできますが、フォルダーの戦略はおそらく(確かに)異なると思います。

なにか提案を?

ありがとう

編集:リモートサーバーです

4

2 に答える 2

0

これがあなたが探しているものかどうかはわかりませんが、クライアント側でこれを管理できる場合は、圧縮されたフォルダー (低圧縮レベル) をアップロードしてサーバーで展開する方が簡単な場合があります。該当する場合は、SharpZipLibのような無料の .net zip ライブラリを使用できるため、自分で zip ルーチンを作成する必要はありません。

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);
    }
}
}
于 2011-08-17T08:01:05.560 に答える
0

私があなたの質問を正しく理解していれば、次のことができます:

A)サーバー上のフォルダー構造を再作成し、そこにファイルを移動します

B)ルートフォルダーを圧縮し、サーバーに移動して解凍します。

于 2011-08-17T07:52:57.770 に答える