文档章节

一个使用C#语言写的FTP地址解析函数

北风其凉
 北风其凉
发布于 2016/10/25 15:53
字数 836
阅读 25
收藏 0

最近写C#程序时遇到了一个场景,需要分析一个FTP地址各项要素,并将之放到一个Dictionary类中。于是我写了一个函数实现这一功能。

FTP地址语法定义在RFC-1738,格式为:ftp://[user[:password]@]host[:port]/url-path

其中,方括号围住的部分为选填项,user为用户名,password为密码,host为FTP地址,port为FTP端口号,url-path为地址后接的目录地址。

函数AnalyzerFtpUrl代码如下:

/// <summary>
/// 解析FTP地址
/// </summary>
/// <param name="ftpUrl"></param>
/// <returns></returns>
public static Dictionary<string, string> AnalyzeFtpUrl(string ftpUrl)
{
    Dictionary<string, string> dic = new Dictionary<string, string>();

    if (string.IsNullOrWhiteSpace(ftpUrl) || !ftpUrl.StartsWith("ftp://"))
    {
        throw new Exception("无效的FTP地址");
    }

    ftpUrl = ftpUrl.Substring(6); //去除最前面的 ftp://

    string userName = "";      //登录用户名
    string userPassword = "";  //登录密码
    string address = "";       //登录地址
    string port = "";          //端口号
    string directory = "";     //内部子目录

    string leftHalf = "";      //@左侧部分 用户名:密码
    string rightHalf = "";     //@右侧部分 登录地址:端口号/内部子目录

    //将FTP地址划分为左侧部分与右侧部分
    int half = ftpUrl.IndexOf('@');
    if (half == -1)
    {
        leftHalf = "";
        rightHalf = ftpUrl;
    }
    else
    {
        leftHalf = ftpUrl.Substring(0, half);
        rightHalf = ftpUrl.Substring(half + 1);
    }

    //解析 用户名:密码
    if (!string.IsNullOrWhiteSpace(leftHalf))
    {
        int half2 = leftHalf.IndexOf(':');
        if (half2 != -1)
        {
            userName = leftHalf.Substring(0, half2);
            userPassword = leftHalf.Substring(half2 + 1);
            if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(userPassword))
            {
                userName = "";
                userPassword = "";
            }
        }
    }

    //解析 登录地址:端口号/内部子目录
    if (!string.IsNullOrWhiteSpace(rightHalf))
    {
        int half3 = rightHalf.IndexOf('/');
        if (half3 != -1)
        {
            directory = rightHalf.Substring(half3);
            if (directory == "/")
            {
                directory = "";
            }
            rightHalf = rightHalf.Substring(0, half3);
        }

        int half4 = rightHalf.IndexOf(':');
        if (half4 == -1)
        {
            address = rightHalf;
        }
        else
        {
            address = rightHalf.Substring(0, half4);
            port = rightHalf.Substring(half4 + 1);
        }

        if (string.IsNullOrWhiteSpace(address))
        {
            throw new Exception("无效的FTP地址");
        }
    }
    else
    {
        throw new Exception("无效的FTP地址");
    }

    //添加字典项
    dic.Add("username", userName);
    dic.Add("userPassword", userPassword);
    dic.Add("address", address);
    dic.Add("port", port);
    dic.Add("directory", directory);

    return dic;
}

建立一个C#命令行应用程序,键入如下代码,其中函数AnalyzeFtpUrl已在上面给出,在此不再赘述。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FtpUrlAnalyzer
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintItem("ftp://flora:123456@127.0.0.1:1024/hi_flora/");
            PrintItem("ftp://127.0.0.1/hi_flora");
            PrintItem("ftp://127.0.0.1:1024/hi_flora");
            PrintItem("ftp://:@127.0.0.1:1024/");
            PrintItem("");
            PrintItem("123456");
            PrintItem("ftp://tsybius2014");
            PrintItem("ftp://:1024/hi_flora");

            Console.Read();
        }

        /// <summary>
        /// 打印FTP
        /// </summary>
        /// <param name="ftpUrl"></param>
        public static void PrintItem(string ftpUrl)
        {
            try
            {
                Console.WriteLine("url [ " + ftpUrl + " ]");
                Console.WriteLine("----------------------");
                Dictionary<string, string> dic = AnalyzeFtpUrl(ftpUrl);
                foreach (KeyValuePair<string, string> pair in dic)
                {
                    Console.WriteLine("key:" + pair.Key + ", value:" + pair.Value);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.WriteLine();
            }
        }

        /// <summary>
        /// 解析FTP地址
        /// </summary>
        /// <param name="ftpUrl"></param>
        /// <returns></returns>
        public static Dictionary<string, string> AnalyzeFtpUrl(string ftpUrl)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            //函数实现逻辑同上,故略
            return dic;
        }

    }
}

程序运行结果输出如下:

url [ ftp://flora:123456@127.0.0.1:1024/hi_flora/ ]
----------------------
key:username, value:flora
key:userPassword, value:123456
key:address, value:127.0.0.1
key:port, value:1024
key:directory, value:/hi_flora/

url [ ftp://127.0.0.1/hi_flora ]
----------------------
key:username, value:
key:userPassword, value:
key:address, value:127.0.0.1
key:port, value:
key:directory, value:/hi_flora

url [ ftp://127.0.0.1:1024/hi_flora ]
----------------------
key:username, value:
key:userPassword, value:
key:address, value:127.0.0.1
key:port, value:1024
key:directory, value:/hi_flora

url [ ftp://:@127.0.0.1:1024/ ]
----------------------
key:username, value:
key:userPassword, value:
key:address, value:127.0.0.1
key:port, value:1024
key:directory, value:

url [  ]
----------------------
System.Exception: 无效的FTP地址
   在 FtpUrlAnalyzer.Program.AnalyzeFtpUrl(String ftpUrl) 位置 d:\MyPrograms\Ftp
UrlAnalyzer\FtpUrlAnalyzer\Program.cs:行号 61
   在 FtpUrlAnalyzer.Program.PrintItem(String ftpUrl) 位置 d:\MyPrograms\FtpUrlA
nalyzer\FtpUrlAnalyzer\Program.cs:行号 34

url [ 123456 ]
----------------------
System.Exception: 无效的FTP地址
   在 FtpUrlAnalyzer.Program.AnalyzeFtpUrl(String ftpUrl) 位置 d:\MyPrograms\Ftp
UrlAnalyzer\FtpUrlAnalyzer\Program.cs:行号 61
   在 FtpUrlAnalyzer.Program.PrintItem(String ftpUrl) 位置 d:\MyPrograms\FtpUrlA
nalyzer\FtpUrlAnalyzer\Program.cs:行号 34

url [ ftp://tsybius2014 ]
----------------------
key:username, value:
key:userPassword, value:
key:address, value:tsybius2014
key:port, value:
key:directory, value:

url [ ftp://:1024/hi_flora ]
----------------------
System.Exception: 无效的FTP地址
   在 FtpUrlAnalyzer.Program.AnalyzeFtpUrl(String ftpUrl) 位置 d:\MyPrograms\Ftp
UrlAnalyzer\FtpUrlAnalyzer\Program.cs:行号 131
   在 FtpUrlAnalyzer.Program.PrintItem(String ftpUrl) 位置 d:\MyPrograms\FtpUrlA
nalyzer\FtpUrlAnalyzer\Program.cs:行号 34

END

© 著作权归作者所有

北风其凉

北风其凉

粉丝 119
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
C#:FTP工具类edtFTPnet使用笔记

最近需要重写一下一个C#客户端程序对FTP服务的支持,上网查了一些资料,看到了一个工具类edtFTPnet,于是今天下载了一个包了解了下。 网站首页、文档地址、下载地址如下: 1、网站首页:htt...

北风其凉
2016/10/17
1K
8
使用C#客户端访问FTP服务的一个解决方案

一、写在前面 最近工作中遇到了一个场景,要用C#客户端访问FTP服务器,并实现文件下载功能。之前我使用了一种非常简单粗暴的方法,因为客户端之前就用到了Xilium.CefGlue(可以理解为一个Web...

北风其凉
2016/07/20
970
0
[原译]C#编写FTP客户端软件

1 介绍 我知道。网上有很多现成的FTP软件。但是。我们也想要了解FTP的一些底层机构,因此。 这个开源的项目在你学习FTP知识的时候也许对你有些帮组。程序的界面看起来像FileZilla,FileZilla...

长平狐
2012/10/11
978
0
[译]GraphQL如何把查询转换为响应(How GraphQL turns a query into a response)

原文链接: How GraphQL turns a query into a response 在这篇文章中,我将回答一个简单的问题,GraphQL如何把查询转换为响应? 如果你对GraphQL还不熟悉,那么在阅读之前,先了解一下“How...

isNeilLin
2018/07/04
0
0
多语言开发的个人体验

在文章的前面,先定义一下,这里谈的“语言”(A)指的是“语言以及使用该语言可以很容易调用的基本类库及可免费或低代价获得的第三方类库及开源类库”(B)。在很多情况下谈“语言”和谈“语...

最美的回忆
2017/06/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
15
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
10
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
14
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
14
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部