编程语言
首页 > 编程语言> > c# – 确定FTP目录是否存在突然停止工作的代码

c# – 确定FTP目录是否存在突然停止工作的代码

作者:互联网

很久以前我写了下面的代码来确定FTP目录是否存在:

public bool DirectoryExists(string directory)
{
    try
    {
        FtpWebRequest request = GetRequest(directory);
        request.Method = WebRequestMethods.Ftp.ListDirectory;

        using (FtpWebResponse response = request.GetResponse() as FtpWebResponse)
        {
            StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII);
            sr.ReadToEnd();
            sr.Close();
            response.Close();
        }
        return true;
    }
    catch { }
    return false;
}

protected FtpWebRequest GetRequest(string filename = "")
{
    FtpWebRequest request = WebRequest.Create(_host.GetUrl(filename)) as FtpWebRequest;
    request.Credentials = new NetworkCredential(Username, Password);
    request.Proxy = null;
    request.KeepAlive = false;
    return request;
}

这段代码已经工作了好几年,但今天却没有.在测试不存在的目录时,DirectoryExists()中的代码不再引发异常,并且该方法错误地返回true.

如果我将sr.ReadToEnd()的结果赋给字符串,则它是一个空字符串.

在这种情况下,代码_host.GetUrl(filename)返回“ftp://www.mydomain.com/Articles/winforms/accessing-the-windows-registry”.这是预期值.当服务器上不存在此路径时,我的DirectoryExists()方法仍然不会抛出异常.我甚至将这个不存在的目录传递给了一个使用WebRequestMethods.Ftp.ListDirectoryDe​​tails构建目录列表的方法.此方法只返回一个空列表,并且不会抛出任何异常.

我相信当我使用Visual Studio 2013将代码移动到新计算机时,我第一次遇到此问题.我使用.NET 4.5并在使用.NET 4.5.1时获得相同的行为.

问题:

>为什么这段代码已经使用了多年并且使用了我发现的大多数在线示例中使用的相同技术?什么可能导致此代码突然停止工作?
>有没有办法检测是否存在有效的目录?我想另一种方法是扫描父目录,尽管当例程应该验证根目录时逻辑需要不同.

解决方法:

我设法在我有权访问的另一个网站上重现您的错误.经过一番游戏,这是我的结论: –

当您使用不以/结尾的FTP URL创建FtpWebRequest时,例如:

ftp://ftp.someftp.com/somefolder/invalidfolder

并且您指定了WebRequestMethods.Ftp.ListDirectory作为方法,然后它在场景后面执行的操作是运行以下命令:

NLST "somefolder/invalidfolder"

通常,NLST将列出指定文件夹的内容,如果该文件夹不存在则抛出异常.但是因为你没有在invalidfolder的末尾指定/,NLST会认为invalidfolder实际上可能是一个文件(或文件名模式).如果它设法找到名为invalidfolder的文件夹,那么它只会将其视为文件夹.否则,它将尝试在父文件夹somefolder下搜索名为invalidfolder的文件.如果该文件不存在,则将发生以下任一情况,具体取决于正在运行的FTP服务器软件(及其配置):

>它会抛出错误550:找不到文件或文件夹. (例如:spftp v1.0)
>它返回一个空结果. (例如:vsFTPd v2.0.5)

在您的情况下,FTP服务器返回后一个响应,您的代码将崩溃.

解决方案?只需添加一些验证代码,以确保您尝试访问的ftp文件夹始终具有/.如下: –

if (!directory.EndsWith('/'))
    directory += '/';

标签:c,net,ftp,ftpwebrequest
来源: https://codeday.me/bug/20190517/1119926.html