FTP: автоматическое создание вложенных каталогов - PullRequest
3 голосов
/ 08 февраля 2012

Мы пытаемся переместить файл на FTP-сайт.Нам нужно создать структуру папок следующим образом:

/ deep / nested / folder / structure / index.html

Вчера мы поняли, что не можем создать большечем одна папка за раз, так что это не работает:

MKD / deep / nested / folder / structure

Итак, в коде мы написали циклсоздавая каждую папку по одной, игнорируя ошибки, вызванные уже существующей папкой.Игнорирование ошибок является грубым.

Является ли способ создания этих вложенных папок одним действием, а не несколькими?Есть ли команда, чтобы увидеть, если папка уже существует?Если мы просто вытолкнем файл, включая полный путь, будет ли FTP достаточно умен, чтобы создавать каталоги для меня?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Нет, стандартного способа создания папки с подпапками не существует.Также нет стандартного способа проверить, существует ли directory .Вам нужно будет использовать LIST или MLSD (где поддерживается) и проанализировать результат для этого.Разве вы не можете просто использовать какой-нибудь сторонний компонент, который поддерживает необходимую функциональность?

0 голосов
/ 23 августа 2017

Я написал простой пример на C #, возможно, кому-то понадобится этот код.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;

namespace Deployer
{
    public class RecursiveFolderUploader
    {
        private const string SrcFullPath = @"C:\prg\Snowinmars\Snowinmars.Ui";
        private readonly IList<string> foldersOnServer;
        private Client ftpClient; // that's your ftp client, init it

        public RecursiveFolderUploader()
        {
            this.foldersOnServer = new List<string>();
        }

        private void UploadAll(DirectoryInfo directoryInfo)
        {
            // ftp://login:password@127.0.0.1/path/to/root/mydir/anotherdir/file.dat
            // ^________________uri_______________________^_relevationPath_^
            foreach (var file in directoryInfo.EnumerateFiles())
            {
                if (!file.Directory.FullName.StartsWith(RecursiveFolderUploader.SrcFullPath))
                {
                    throw new InvalidOperationException($"File {file.FullName} is not from {RecursiveFolderUploader.SrcFullPath} folder");
                }

                string relevationPath; // all folders from root up to file

                if (file.Directory.FullName.Length == RecursiveFolderUploader.SrcFullPath.Length)
                {
                    relevationPath = "";
                }
                else
                {
                    relevationPath = file.Directory.FullName.Substring(RecursiveFolderUploader.SrcFullPath.Length, file.Directory.FullName.Length - RecursiveFolderUploader.SrcFullPath.Length);

                    if (relevationPath.StartsWith("\\"))
                    {
                        relevationPath = relevationPath.Remove(0, 1);
                    }
                }

                string destination;
                if (string.IsNullOrWhiteSpace(relevationPath))
                {
                    destination = file.Name;
                }
                else
                {
                    destination = Path.Combine(relevationPath, file.Name).Replace("\\", "/");
                }

                try
                {
                    ftpClient.UploadFile(file.FullName, destination);
                }
                catch (WebException e)
                {
                    // that means that there's no such folder or something else goes wrong
                    // we can check it by creating folders and try again
                    var parts = relevationPath.Replace("\\", "/").Split('/');

                    for (int i = 1; i <= parts.Length; i++)
                    {
                        var path = string.Join("/", parts.Take(i));

                        if (!foldersOnServer.Contains(path))
                        {
                            ftpClient.MakeDirectory(path);
                            foldersOnServer.Add(path);
                        }
                    }

                    try
                    {
                        ftpClient.UploadFile(file.FullName, destination);
                    }
                    catch (Exception innerE)
                    {
                        // if it doesn't help - trouble isn't in folders
                        throw new WebException($"Can't find folder {relevationPath}", innerE);
                    }
                }
            }

            foreach (var directory in directoryInfo.EnumerateDirectories())
            {
                UploadAll(directory);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...