UN3L6——其它操作

其它操作

除了上传和下载,我们可能会对FTP服务器上的内容进行其它操作,比如:

  1. 删除文件
  2. 获取文件大小
  3. 创建文件夹
  4. 获取文件列表

等等

进行其他操作

  • 删除文件

    删除哪个文件取决于在创建连接时传入了哪个文件的路径
    删除文件的命令通过WebRequestMethods.Ftp.DeleteFile​获取,
    执行FtpWebRequest.GetResponse()​就会真正的执行删除的逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //FtpManager内

    /// <summary>
    /// 移除指定的文件
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="action">移除过后要做什么的委托</param>
    public async void DeleteFile(string fileName, UnityAction<bool> action = null)
    {
    await Task.Run(() =>
    {
    try
    {
    //创建一个Ftp连接
    FtpWebRequest request = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;
    //设置代理,凭证,是否保持连接,操作类型,是否使用二进制传输数据
    request.Proxy = null;
    request.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
    request.KeepAlive = false;
    request.Method = WebRequestMethods.Ftp.DeleteFile;
    request.UseBinary = true;
    //真正的删除
    FtpWebResponse response = request.GetResponse() as FtpWebResponse;
    response.Close();
    action?.Invoke(true);
    }
    catch (Exception e)
    {
    Debug.Log("移除失败!" + e.Message);
    action?.Invoke(false);
    }
    });
    }
    1
    2
    3
    4
    FtpManager.Instance.DeleteFile("测试测试.txt", (result) =>
    {
    print(result ? "删除成功" : "删除失败");
    });
  • 获取文件大小

    获取哪个文件大小取决于在创建连接时传入了哪个文件的路径
    获取文件大小命令通过WebRequestMethods.Ftp.GetFileSize​获取,
    执行FtpWebRequest.GetResponse()​就会真正的执行获取文件大小的逻辑
    再通过FtpWebResponse.ContentLength​就可以获取到文件大小

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //FtpManager内

    /// <summary>
    /// 获取FTP服务器上某个文件大小,单位是字节
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="action">获取后要传递给外部的具体的大小</param>
    public async void GetFileSize(string fileName, UnityAction<long> action = null)
    {
    await Task.Run(() =>
    {
    try
    {
    //创建一个Ftp连接
    FtpWebRequest request = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;
    //设置代理,凭证,是否保持连接,操作类型,是否使用二进制传输数据
    request.Proxy = null;
    request.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
    request.KeepAlive = false;
    request.Method = WebRequestMethods.Ftp.GetFileSize;
    request.UseBinary = true;
    //获取真正的长度
    FtpWebResponse response = request.GetResponse() as FtpWebResponse;
    response.Close();
    action?.Invoke(response.ContentLength);
    }
    catch (Exception e)
    {
    Debug.Log("获取大小失败!" + e.Message);
    action?.Invoke(0);
    }
    });
    }
    1
    2
    3
    4
    FtpManager.Instance.GetFileSize("下载测试.png", (size) =>
    {
    print("文件大小为" + size);
    });
  • 创建文件夹

    文件夹创建到哪个路径下和文件夹使用什么名字取决于在创建连接时传入的路径
    创建文件夹命令通过WebRequestMethods.Ftp.MakeDirectory​获取,
    执行FtpWebRequest.GetResponse()​就会真正的执行创建文件夹的逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    /// <summary>
    /// 创建一个文件夹在FTP服务器上
    /// </summary>
    /// <param name="directoryName">文件夹某种</param>
    /// <param name="action">创建完成后的回调</param>
    public async void CreateDirectory(string directoryName, UnityAction<bool> action = null)
    {
    await Task.Run(() =>
    {
    try
    {
    //创建一个Ftp连接
    FtpWebRequest request = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;
    //设置代理,凭证,是否保持连接,操作类型,是否使用二进制传输数据
    request.Proxy = null;
    request.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
    request.KeepAlive = false;
    request.Method = WebRequestMethods.Ftp.MakeDirectory;
    request.UseBinary = true;
    //创建文件夹
    FtpWebResponse response = request.GetResponse() as FtpWebResponse;
    response.Close();
    action?.Invoke(true);
    }
    catch (Exception e)
    {
    Debug.Log("创建文件夹失败!" + e.Message);
    action?.Invoke(false);
    }
    });
    }
    1
    2
    3
    4
    FtpManager.Instance.CreateDirectory("创建文件夹测试", (result) =>
    {
    print(result ? "创建成功" : "创建失败");
    });
  • 获取文件列表

    获取哪个文件夹下的文件列表取决于在创建连接时传入了哪个文件的路径(不会去获取子文件夹及子文件夹下的文件)
    获取文件大小命令通过WebRequestMethods.Ftp.ListDirectory​获取,
    执行FtpWebRequest.GetResponse()​就会真正的执行获取文件列表的逻辑
    由于文件列表是以一行一行的文本形式传递的,因此,就像下载文件那样,可以通过文件流一行一行的读取文件名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /// <summary>
    /// 获取某个文件夹下所有文件名
    /// </summary>
    /// <param name="directoryName">文件夹路径</param>
    /// <param name="action">获取后做什么</param>
    public async void GetFileList(string directoryName, UnityAction<List<string>> action = null)
    {
    await Task.Run(() =>
    {
    try
    {
    //创建一个Ftp连接
    FtpWebRequest request = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;
    //设置代理,凭证,是否保持连接,操作类型,是否使用二进制传输数据
    request.Proxy = null;
    request.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
    request.KeepAlive = false;
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    request.UseBinary = true;
    //获取文件列表,它是以流的形式传输的,返回一行一行的文件名信息
    FtpWebResponse response = request.GetResponse() as FtpWebResponse;
    //把下载的信息流转换成StreamReader对象,方便我们一行一行的读取信息
    StreamReader streamReader = new StreamReader(response.GetResponseStream());
    List<string> nameStrs = new List<string>();
    //一行一行的读取
    string line = streamReader.ReadLine();
    //循环读取文本
    while (line != null)
    {
    nameStrs.Add(line);
    line = streamReader.ReadLine();
    }
    response.Close();
    action?.Invoke(nameStrs);
    }
    catch (Exception e)
    {
    Debug.Log("创建文件夹失败!" + e.Message);
    action?.Invoke(null);
    }
    });
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FtpManager.Instance.GetFileList("", (list) =>
    {
    if (list == null)
    {
    print("获取失败!");
    return;
    }
    for (int i = 0; i < list.Count; i++)
    {
    print(list[i]);
    }
    });