C # FTP, как проверить, является ли путь файлом или каталогом? - PullRequest
4 голосов
/ 11 ноября 2011

У меня есть массив, содержащий некоторые пути FTP, например:

"ftp // ip / directory / directory1",
"ftp // ip / directory / directory2",
"ftp // ip / directory / file.txt",
"ftp // ip / directory / directory3",
"ftp // ip / directory / another_file.csv"

Как можноя узнаю, является ли путь файлом или каталогом?

Заранее спасибо.

Ответы [ 7 ]

5 голосов
/ 27 сентября 2013

Используйте команду LIST, которую вы можете сослаться на RFC959, чтобы получить подробную информацию об элементах по указанному пути.Например, сервер FileZilla, команда LIST вернет стандартный формат разрешений LINUX, который вы можете найти здесь .Первая буква указывает, является ли запрашиваемый путь файлом или каталогом.Также можно найти простую библиотеку, написанную на C # здесь

4 голосов
/ 05 января 2017

У меня была такая же проблема. Я работал от Хьюс ответ. Вам нужно сделать FTPRequest вроде:

request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

возьмите его из потокового ридера и вставьте в строку

StreamReader reader = new StreamReader(responseStream);

            string directoryRaw = null;

            try { while (reader.Peek() != -1) { directoryRaw +=    reader.ReadLine() + "|"; } }
            catch (Exception ex) { Console.WriteLine(ex.ToString()); }

когда вы напечатаете это, оно будет выглядеть так:

| -rw-r - r-- 1 пользователь 1699 1 июня 2015 404.shtml

| drwxr-xr-x 2 user user 4096 8 сен 19:39 cgi-bin

| drwxr-xr-x 2 user user 4096 3 ноября 10:52 css

Они разделены | так что это будет разделителем для строки split

если он начинается с d, а не с - то это каталог, в противном случае это файл.

все они имеют одинаковый размер перед именем файла, поэтому создайте новую строку для каждой из этих строк, начиная с позиции 62 до конца, и это будет имя файла.

Надеюсь, это поможет

2 голосов
/ 11 ноября 2011

Один из способов сделать это, если мы можем предположить, что все файлы будут заканчиваться расширением, а все каталоги не будут иметь расширения, мы можем использовать метод System.IO.Path.GetExtension (), например:

public bool IsDirectory(string directory)
{
    if(directory == null)
    {
        throw new ArgumentNullException(); // or however you want to handle null values
    }

    // GetExtension(string) returns string.Empty when no extension found
    return System.IO.Path.GetExtension(directory) == string.Empty;
}
2 голосов
/ 11 ноября 2011

Прямого пути нет.

Косвенно можно предположить , что имена файлов без точки "."являются каталогами, но это не всегда так.

Лучше всего тщательно написать код, который использует эти пути, поэтому он, например, рассматривает путь как каталог, а затем, если FTP-сервер сообщает об ошибке, обрабатываетэто как файл.

0 голосов
/ 29 июня 2018

У меня была такая же проблема, поэтому я использовал GetFileSize, чтобы проверить, является ли это файл или каталог

var isFile = FtpHelper.IsFile ("ftpURL", "userName", "password");

using System;
using System.Net;

public static class FtpHelper
{
    public static bool IsFile(Uri requestUri, NetworkCredential networkCredential)
    {
        return GetFtpFileSize(requestUri, networkCredential) != default(long); //It's a Directory if it has no size
    }
    public static FtpWebRequest GetFtpWebRequest(Uri requestUri, NetworkCredential networkCredential, string method = null)
    {
        var ftpWebRequest = (FtpWebRequest)WebRequest.Create(requestUri); //Create FtpWebRequest with given Request Uri.
        ftpWebRequest.Credentials = networkCredential; //Set the Credentials of current FtpWebRequest.

        if (!string.IsNullOrEmpty(method))
            ftpWebRequest.Method = method; //Set the Method of FtpWebRequest incase it has a value.
        return ftpWebRequest; //Return the configured FtpWebRequest.
    }
    public static long GetFtpFileSize(Uri requestUri, NetworkCredential networkCredential)
    {
        //Create ftpWebRequest object with given options to get the File Size. 
        var ftpWebRequest = GetFtpWebRequest(requestUri, networkCredential, WebRequestMethods.Ftp.GetFileSize);

        try { return ((FtpWebResponse)ftpWebRequest.GetResponse()).ContentLength; } //Incase of success it'll return the File Size.
        catch (Exception) { return default(long); } //Incase of fail it'll return default value to check it later.
    }
}
0 голосов
/ 19 октября 2015

Я нашел "взломать", как определить тип цели.Если вы будете использовать

request.Method = WebRequestMethods.Ftp.GetFileSize;

в папке, это приведет к исключению

Необработанное исключение: System.Net.WebException: удаленный сервер вернул ошибку r: (550) Файл недоступен (например, файл не найден, нет доступа).

Но используя его для файла, он, естественно, вернет свой размер.

Я создал пример кода для такого метода.

    static bool IsFile(string ftpPath)
    {
        var request = (FtpWebRequest)WebRequest.Create(ftpPath);
        request.Method = WebRequestMethods.Ftp.GetFileSize;

        request.Credentials = new NetworkCredential("foo", "bar");
        try
        {
            using (var response = (FtpWebResponse)request.GetResponse())
            using (var responseStream = response.GetResponseStream())
            {
                return true;
            }
        }
        catch(WebException ex)
        {
            return false;
        }
    }

Возможно, вы захотите изменить его, потому что этот перехватит любую ошибку FTP.

0 голосов
/ 11 ноября 2011

Вы можете использовать System.IO.Path.GetExtension (path) `как способ проверить, имеет ли ваш путь расширение файла.

С учетом" ftp // ip / directory "/ directory1 "или" ftp // ip / directory / directory2 / ", GetExtension вернет вам String.Empty.

Это не надежно, и это возможно, хотя, если был файл без расширениячто это сломается полностью, или каталог с точкой в ​​нем может вызвать проблемы.

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