Dir существует или нет на FTP - PullRequest
1 голос
/ 05 января 2010

Как проверить, существует ли на сервере какой-либо DIR или нет? Хотя я могу проверить, существует ли файл или нет через:

try
{
    FtpWebRequest request=null;

    request = (FtpWebRequest)WebRequest.Create("ftp://" + webrequestUrl + "/somefile.txt");
    request.Credentials = new NetworkCredential(username, password);
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    {
        // Okay.  
    }
}
catch (WebException ex)
{
    if (ex.Response != null)
    {
        FtpWebResponse response = (FtpWebResponse)ex.Response;
        if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
        {
            //task
        }
    }
}

Но как мне проверить DIR? Если я только укажу DIR в URI, то он не будет пойман, если DIR не существует.

Ответы [ 4 ]

2 голосов
/ 05 января 2010
request = (FtpWebRequest)WebRequest.Create("ftp://" + webrequestUrl); //no file name
request.Credentials = new NetworkCredential(username, password);
myFtpRequest.Method = WebRequestMethods.Ftp.ListDirectory;

И проверьте, есть ли ваш файл / каталог в списке.

Вам нужно запросить ответ, он должен содержать список возможных файлов и каталогов.

Вы не должны использовать catch для обработки потока программы. Пример MSDN

0 голосов
/ 16 января 2015

Используя edtFTPnet

  private void ftp_folder_IsExists()
{
    FTPClient ftp = default(FTPClient);

    ftp = new FTPClient("ftp_host_name_here");  // ex.:- no need to use ftp in the host name, provide name only
    ftp.Login("username", "password");

    string[] file_and_folders = ftp.Dir(".", false);// . is used to get all the [files and folders] in the root of FTP

    string[] file_and_folders_1 = ftp.Dir("MyFolder", false);// this will get all the [files and folder] inside MyFolder (ex. ftp.ahostname.com/MyFolder/)


    //checking for a FILE
    if (file_and_folders.Contains("something.txt")) {
        //Do what you want..
    } else {
        //Do what you want..

    }

    //checking for a FOLDER
    if (file_and_folders.Contains("A_Folder")) {
        //Do what you want..
    } else {
        //Do what you want..

    }

}

Примечание: код, написанный в VB.NET и преобразованный с использованием http://converter.telerik.com/

0 голосов
/ 24 сентября 2010

Я использую:

private bool CreateFTPDirectory(string directory)
{

    try
    {
        //create the directory
        FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri(FtpURI+"/"+directory));
        requestDir.Method = WebRequestMethods.Ftp.MakeDirectory;
        requestDir.UsePassive = true;
        requestDir.UseBinary = true;
        requestDir.KeepAlive = false;
        //requestDir.UseDefaultCredentials = true;
        requestDir.Credentials = new NetworkCredential(UserId, Password);
        requestDir.Proxy = WebRequest.DefaultWebProxy;
        requestDir.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;

        FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse();
        Stream ftpStream = response.GetResponseStream();

        ftpStream.Close();
        response.Close();

        return true;
    }
    catch (WebException ex)
    {
        FtpWebResponse response = (FtpWebResponse)ex.Response;
        if ((response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) || (((int)response.StatusCode)==521))
        {
            response.Close();
            return true;
        }
        else
        {
            response.Close();
            return false;
        }
    }
}

У этого также есть побочный эффект создания каталога. Если он уже существует, вы получите результат 521, который не определен в .NET Enum.

Когда вы подключаетесь к FTP-серверу, вы можете указать Uri как "ftp // ftp.domain.com / somedirectory", но это означает: "ftp://ftp.domain.com/homedirectoryforftp/somedirectory". Чтобы иметь возможность определить полный корневой каталог, используйте "ftp://ftp.domain.com//somedirectory", который переводится в // somedirectory на компьютере.

0 голосов
/ 05 января 2010

Я не думаю, что код делает то, что вы думаете, что он делает. Насколько я понимаю, вы пытаетесь получить файл ls (например, dir в DOS / Windows, список файлов в каталоге) для файла. Это не имеет смысла. В некоторой степени это работает, потому что вы получаете исключение при попытке доступа к каталогу "somefile.txt".

Вы должны быть в состоянии сделать это правильно (tm), посмотрев на вывод ответа ListDirectory родителя:

Сделайте ListDirectory ftp://yourserver/ и проверьте, если

  • ваш файл
  • ваш каталог

указан в списке.

...