Свободный FTP получить последние файлы и скачать - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно вернуть файлы сегодняшнего дня, которые являются CSV-файлами, в локальный каталог. Я использовал этот пример с свободного сайта ftp, но он не работает, он находит каталог / in / в порядке, и там есть тестовый файл.но он не загружает файл.

public  void GetListing()
{
        using (FtpClient conn = new FtpClient())
        {
            conn.Host = ftpIpAddress;
            conn.Credentials = new NetworkCredential(ftpUserName,ftpPassword);

            foreach (FtpListItem item in conn.GetListing(conn.GetWorkingDirectory(),
                FtpListOption.Modify | FtpListOption.Size))
            {

                switch (item.Type)
                {
                    case FtpFileSystemObjectType.Directory:
                        break;
                    case FtpFileSystemObjectType.File:
                        Console.Write("Filename " + item.FullName);
                        conn.DownloadFile(item.FullName,"/in/");
                        break;
                    case FtpFileSystemObjectType.Link:
                        // derefernece symbolic links
                        if (item.LinkTarget != null)
                        {
                            // see the DereferenceLink() example
                            // for more details about resolving links.
                            item.LinkObject = conn.DereferenceLink(item);

                            if (item.LinkObject != null)
                            {
                                // switch (item.LinkObject.Type)...
                            }
                        }
                        break;
                }
            }

            // same example except automatically dereference symbolic links.
            // see the DereferenceLink() example for more details about resolving links.
            foreach (FtpListItem item in conn.GetListing(conn.GetWorkingDirectory(),
                FtpListOption.Modify | FtpListOption.Size | FtpListOption.DerefLinks))
            {

                switch (item.Type)
                {
                    case FtpFileSystemObjectType.Directory:
                        break;
                    case FtpFileSystemObjectType.File:
                        Console.Write("File " + item.FullName);
                        break;
                    case FtpFileSystemObjectType.Link:
                        if (item.LinkObject != null)
                        {
                            // switch (item.LinkObject.Type)...
                        }
                        break;
                }
            }
        }
  }

Я установил тестовую среду с сервером filezilla на 127.0.1 Я передаю свои данные своему классу ниже как таковой

ServerConnection connection = new ServerConnection();
connection.ftpIpAddress = "127.0.0.1";
connection.ftpUserName = "ftpuser";
connection.ftpPassword = "ftppassword";
connection.LocalDestDirectory = @"C:\ImportedFromPump\in";
connection.remoteDirectory = @"\in\";

IЯ хочу сохранить файлы в локальном каталоге, а также после их загрузки. Я хочу удалить их с ftp, но я не уверен, как это сделать.

Я следовал этому уроку здесь.

https://github.com/robinrodricks/FluentFTP/blob/master/FluentFTP.Examples/GetListing.cs

Результаты отладочной информации:

# OpenPassiveDataStream(AutoPassive, "MLSD /", 0)
Command:  EPSV
Response: 229 Entering Extended Passive Mode (|||63478|)
Status:   Connecting to 127.0.0.1:63478
Command:  MLSD /
Response: 150 Opening data channel for directory listing of "/"
+---------------------------------------+
Listing:  type=dir;modify=20181018113309; Archived
Listing:  type=dir;modify=20181018115328; in
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226 Successfully transferred "/"
Status:   Disposing FtpSocketStream...

# Dispose()
Status:   Disposing FtpClient object...
Command:  QUIT
Response: 221 Goodbye
Status:   Disposing FtpSocketStream...
Status:   Disposing FtpSocketStream...

Изменить 2

Хорошо, поэтому я получаюнемного дальше и изменил мой код для использования файла загрузки, но теперь я получаю сообщение об отказе в доступе.

public void GetListing()
{
        try
        {
            using (FtpClient conn = new FtpClient())
            {
                IEnumerable<string> directorys = new[] { "/in" };

                conn.Host = ftpIpAddress;
                conn.Credentials = new NetworkCredential(ftpUserName, ftpPassword);

                FtpListItem[] files = conn.GetListing("/in/", FtpListOption.AllFiles)
            .Where(x => x.Type == FtpFileSystemObjectType.File)
            .OrderBy(x => x.Modified)
            .ToArray();

                foreach(FtpListItem file in files)
                {

                    conn.DownloadFile(Environment.GetEnvironmentVariable("LocalAppData") + @"\Fuel\",file.FullName, true);

                }


            }
        }
        catch
        (Exception ex)
        {


        }
}

Ошибка здесь

DownloadFile ("C: \ Users \user \ AppData \ Local \ Fuel \ "," /in/FuelPumpData.csv ",True, None) Возникло исключение:

'System.IO.DirectoryNotFoundException' в mscorlib.dll

Даже думал, что это папка пользователя, и она существует, что, черт возьми, происходит.

Редактировать 2 Чтобы доказать, что каталог существует.enter image description here

Изменить 3 Чтобы показать, что каталог ftp существует

enter image description here

Редактировать 4

Чтобы доказать, что объект .net находит файл в коде.

enter image description here

Редактировать 5 Показать каталог разрешений.enter image description here

Редактировать 6

enter image description here

1 Ответ

0 голосов
/ 18 октября 2018

Первый аргумент FtpClient.DownloadFile() - это имя файла, а не имя каталога.Если вы укажете имя каталога, операция завершится с этим исключением, поскольку вы не можете открыть FileStream в каталоге (это то, что внутренне делает библиотека FluentFTP).

Вы можете, например, построитьцелевое имя файла, как это:

var localFile = Path.Combine(Environment.GetEnvironmentVariable("LocalAppData"), "Fuel", file.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...