Как отправить папку с ее содержимым (подпапкой / файлами) на сервер-клиент? - PullRequest
1 голос
/ 01 марта 2012

Я делаю приложение для передачи файлов (сервер-клиент). Я использую TCP. (.net 4.0)

Как отправить папку со всем ее содержимым (папкой / файлами) на другую сторону ??

У меня есть эти методы, которые отлично работают:

Send(string srcPath, string destPath)  //sends a single file

Recieve(string destPath) //recieves a single file

Это метод отправки:

public void Send(string srcPath, string destPath)
{
    using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read))
    {
        try
        {
            fileSize = fs.Length;
            while (sum < fileSize)
            {
                if (fileSize - sum < packetSize)
                {
                    count = fs.Read(data, 0, (int)(fileSize - sum));
                    network.Write(data, 0, (int)(fileSize - sum));
                }
                else
                {
                    count = fs.Read(data, 0, data.Length);
                    network.Write(data, 0, data.Length);
                }
                fs.Seek(sum, SeekOrigin.Begin);
                sum += count;
            }
            network.Flush();
        }
        finally
        {
            fs.Dispose();
        }
    }
}

и это метод получения:

    public void Recieve(string destPath)
    {
        using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
        {
            try
            {
                while (sum < fileSize)
                {
                    if (fileSize - sum < packetSize)
                    {
                        count = network.Read(data, 0, (int)(fileSize - sum));
                        fs.Write(data, 0, (int)(fileSize - sum));
                    }
                    else
                    {
                        count = network.Read(data, 0, data.Length);
                        fs.Write(data, 0, data.Length);
                    }
                    fs.Seek(sum, SeekOrigin.Begin);
                    sum += count;
                }
            }
            finally
            {
                fs.Dispose();
            }
        }
    }

Это общие переменные:

    const int packetSize = 1024 * 8;    //Packet Size.
    long sum;                           //Sum of sent data.
    long fileSize;                      //File Size.
    int count = 0;                      //data counter.
    static byte[] data = null;          //data buffer.

    NetworkStream network; 
    FileStream fs;

Я также получил:

bool IsFolder(string path) //that returns if the path is a folder or a file

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Я разобрался с ответом

public void SendFolder(string srcPath, string destPath)
    {
        string dirName = Path.Combine(destPath, Path.GetFileName(srcPath));
        CreateDirectory(dirName);  // consider that this method creates a directory at the server
        string[] fileEntries = Directory.GetFiles(srcPath);
        string[] subDirEntries = Directory.GetDirectories(srcPath);
        foreach (string filePath in fileEntries)
        {
            Send(srcPath, dirName);
        }
        foreach (string dirPath in subDirEntries)
        {
            SendFolder(dirPath, dirName);
        }
    }

сервер сначала создаст директорию .. с таким же именем каталога со стороны клиента .. которая называется dirName

тогда он отправит все файлы в этой папке .. тогда он будет рекурсивно делать то же самое для каждой папки .. проблема решена

1 голос
/ 01 марта 2012

Путь к каталогу может сделать это:

    public void SendAll(string DirectoryPath)
    {

        if (Directory.Exists(DirectoryPath))
            {
                string[] fileEntries = Directory.GetFiles(DirectoryPath);
                string[] subdirEntries = Directory.GetDirectories(DirectoryPath);

                foreach (string fileName in fileEntries)
                {
                    Send(fileName);


    }

            foreach (string dirName in subdirEntries)
            {
                SendAll(dirName);
            }
        }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...