45.FTP其他操作

45.网络通信-文件传输FTP-其他操作


45.1 知识点

FTP其它操作指什么?

  • 除了上传和下载,我们可能会对FTP服务器上的内容进行其它操作
    • 删除文件
    • 获取文件大小
    • 创建文件夹
    • 获取文件列表
    • 等等

进行其它操作

其他操作逻辑都写在FTP管理器上

移除指定的文件
/// <summary>
/// 移除指定的文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="action">移除过后想做什么的委托函数</param>
public async void DeleteFile(string fileName, UnityAction<bool> action = null)
{
    await Task.Run(() => {
        try
        {
            // 通过一个线程执行这里面的逻辑 那么就不会影响主线程了
            // 1.创建一个Ftp连接
            FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;
            // 2.进行一些设置
            // 凭证
            req.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
            // 是否操作结束后 关闭 控制连接
            req.KeepAlive = false;
            // 传输类型
            req.UseBinary = true;
            // 操作类型
            req.Method = WebRequestMethods.Ftp.DeleteFile;
            // 代理设置为空
            req.Proxy = null;

            // 3.真正的删除
            FtpWebResponse ftpWebResponse = req.GetResponse() as FtpWebResponse;
            ftpWebResponse.Close();

            // 删除成功
            action?.Invoke(true);
        }
        catch (Exception e)
        {
            Debug.Log("移除失败" + e.Message);

            // 删除失败
            action?.Invoke(false);
        }
    });
}
获取FTP服务器上某个文件的大小
/// <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
        {
            // 通过一个线程执行这里面的逻辑 那么就不会影响主线程了
            // 1.创建一个Ftp连接
            FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;

            // 2.进行一些设置
            // 凭证
            ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
            // 是否操作结束后 关闭 控制连接
            ftpWebRequest.KeepAlive = false;
            // 传输类型
            ftpWebRequest.UseBinary = true;
            // 操作类型
            ftpWebRequest.Method = WebRequestMethods.Ftp.GetFileSize;
            // 代理设置为空
            ftpWebRequest.Proxy = null;

            // 3.真正的获取
            FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
            // 把大小传递给外部 ContentLength是响应对象的字节的大小
            action?.Invoke(ftpWebResponse.ContentLength);

            ftpWebResponse.Close();
        }
        catch (Exception e)
        {
            Debug.Log("获取大小失败" + e.Message);
            action?.Invoke(0);
        }
    });
}
创建一个文件夹
/// <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
        {
            // 通过一个线程执行这里面的逻辑 那么就不会影响主线程了

            // 1.创建一个Ftp连接
            FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;

            // 2.进行一些设置
            // 凭证
            ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
            // 是否操作结束后 关闭 控制连接
            ftpWebRequest.KeepAlive = false;
            // 传输类型
            ftpWebRequest.UseBinary = true;
            // 操作类型
            ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
            // 代理设置为空
            ftpWebRequest.Proxy = null;

            // 3.真正的创建
            FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
            ftpWebResponse.Close();

            action?.Invoke(true);
        }
        catch (Exception e)
        {
            Debug.Log("创建文件夹失败" + e.Message);
            action?.Invoke(false);
        }
    });
}
获取指定路径下 所有文件的文件名 不包括子文件夹
/// <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
        {
            // 通过一个线程执行这里面的逻辑 那么就不会影响主线程了

            // 1.创建一个Ftp连接
            FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;

            // 2.进行一些设置
            // 凭证
            ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
            // 是否操作结束后 关闭 控制连接
            ftpWebRequest.KeepAlive = false;
            // 传输类型
            ftpWebRequest.UseBinary = true;
            // 操作类型
            ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
            // 代理设置为空
            ftpWebRequest.Proxy = null;

            // 3.真正的创建
            FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
            // 把下载的信息流 转换成StreamReader对象 方便我们一行一行的读取信息
            StreamReader streamReader = new StreamReader(ftpWebResponse.GetResponseStream());

            // 用于存储文件名的列表
            List<string> nameStrs = new List<string>();
            // 一行行的读取
            string line = streamReader.ReadLine();
            while (line != null)
            {
                // 文件名列表添加元素
                nameStrs.Add(line);
                // 一行行的读取
                line = streamReader.ReadLine();
            }
            ftpWebResponse.Close();

            action?.Invoke(nameStrs);
        }
        catch (Exception e)
        {
            Debug.Log("获取文件列表失败" + e.Message);
            action?.Invoke(null);
        }
    });
}

进行其他操作测试

// 1.删除文件
FtpManager.Instance.DeleteFile("MrTaoPic.png", (result) =>
{
    print(result ? "删除成功" : "删除失败");
});
// 假如服务器上没有指定删除的文件会报错

// 2.获取文件大小
FtpManager.Instance.GetFileSize("pic.png", (size) =>
{
    print("文件大小为:" + size);
});

// 3.创建文件夹
FtpManager.Instance.CreateDirectory("韬老狮", (result) =>
{
    print(result ? "创建成功" : "创建失败");
});
// 假如服务器上有指同名文件夹会报错

// 4.获取文件列表
FtpManager.Instance.GetFileList("", (list) =>
{
    if (list == null)
    {
        print("获取文件列表失败");
        return;
    }
    for (int i = 0; i < list.Count; i++)
    {
        print(list[i]);
    }
});

总结

  • FTP对于我们的作用

    • 游戏当中的一些上传和下载功能
    • 原生AB包上传下载
    • 上传下载一些语音内容
  • 只要是上传下载相关的功能 都可以使用Ftp来完成


45.2 知识点代码

FtpManager

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;

public class FtpManager : BaseSingletonInCSharp<FtpManager>
{
    //远端FTP服务器的地址 这里用本机来测试
    private string FTP_PATH = "ftp://127.0.0.1/";
    //用户名和密码
    private string USER_NAME = "MrTao";
    private string PASSWORD = "MrTao";

    /// <summary>
    /// 上传文件到Ftp服务器(异步)
    /// </summary>
    /// <param name="fileName">FTP上的文件名</param>
    /// <param name="localPath">本地文件路径</param>
    /// <param name="action">上传完毕后想要做什么的委托函数</param>
    public async void UpLoadFile(string fileName, string localPath, UnityAction action = null)
    {
        //异步任务
        await Task.Run(() =>
        {
            try
            {
                //通过一个线程执行这里面的逻辑 那么就不会影响主线程了
                //1.创建一个Ftp连接
                FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;

                //2.进行一些设置
                //凭证
                ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                //是否操作结束后 关闭 控制连接
                ftpWebRequest.KeepAlive = false;
                //传输类型
                ftpWebRequest.UseBinary = true;
                //操作类型
                ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
                //代理设置为空
                ftpWebRequest.Proxy = null;

                //3.上传
                Stream uploadRequestStream = ftpWebRequest.GetRequestStream();
                //开始上传
                using (FileStream fileStream = File.OpenRead(localPath))
                {
                    byte[] bytes = new byte[1024];
                    //返回值 为具体读取了多少个字节
                    int contentLength = fileStream.Read(bytes, 0, bytes.Length);
                    //有数据就上传
                    while (contentLength != 0)
                    {
                        //读了多少就写(上传)多少
                        uploadRequestStream.Write(bytes, 0, contentLength);
                        //继续从本地文件中读取数据
                        contentLength = fileStream.Read(bytes, 0, bytes.Length);
                    }
                    //上传结束
                    fileStream.Close();
                    uploadRequestStream.Close();
                }
                Debug.Log("上传成功");
            }
            catch (Exception e)
            {
                Debug.Log("上传文件出错" + e.Message);
            }
        });
        //上传结束后 你想在外部做的事情
        action?.Invoke();
    }

    /// <summary>
    /// 下载文件从Ftp服务器当中(异步)
    /// </summary>
    /// <param name="fileName">FTP上想要下载的文件名</param>
    /// <param name="localPath">存储的本地文件路径</param>
    /// <param name="action">下载完毕后想要做什么的委托函数</param>
    public async void DownLoadFile(string fileName, string localPath, UnityAction action = null)
    {
        await Task.Run(() => {
            try
            {
                //1.创建一个Ftp连接
                FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;

                //2.进行一些设置
                //凭证
                ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                //是否操作结束后 关闭 控制连接
                ftpWebRequest.KeepAlive = false;
                //传输类型
                ftpWebRequest.UseBinary = true;
                //操作类型
                ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                //代理设置为空
                ftpWebRequest.Proxy = null;

                //3.下载
                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                Stream downloadResponseStream = ftpWebResponse.GetResponseStream();

                //写入到本地文件中
                using (FileStream fileStream = File.Create(localPath))
                {
                    byte[] bytes = new byte[1024];
                    //读取数据
                    int contentLength = downloadResponseStream.Read(bytes, 0, bytes.Length);
                    //一点一点的写入
                    while (contentLength != 0)
                    {
                        //读多少 写多少
                        fileStream.Write(bytes, 0, contentLength);
                        //继续读
                        contentLength = downloadResponseStream.Read(bytes, 0, bytes.Length);
                    }
                    fileStream.Close();
                    downloadResponseStream.Close();
                }
                //关闭服务器响应
                ftpWebResponse.Close();
                Debug.Log("下载成功");
            }
            catch (Exception e)
            {
                Debug.Log("下载失败" + e.Message);
            }
        });

        //如果下载结束有想做的事情 在这里调用外部传入的委托函数
        action?.Invoke();
    }

    /// <summary>
    /// 移除指定的文件
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="action">移除过后想做什么的委托函数</param>
    public async void DeleteFile(string fileName, UnityAction<bool> action = null)
    {
        await Task.Run(() => {
            try
            {
                //通过一个线程执行这里面的逻辑 那么就不会影响主线程了
                //1.创建一个Ftp连接
                FtpWebRequest req = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;
                //2.进行一些设置
                //凭证
                req.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                //是否操作结束后 关闭 控制连接
                req.KeepAlive = false;
                //传输类型
                req.UseBinary = true;
                //操作类型
                req.Method = WebRequestMethods.Ftp.DeleteFile;
                //代理设置为空
                req.Proxy = null;

                //3.真正的删除
                FtpWebResponse ftpWebResponse = req.GetResponse() as FtpWebResponse;
                ftpWebResponse.Close();

                //删除成功
                action?.Invoke(true);
            }
            catch (Exception e)
            {
                Debug.Log("移除失败" + e.Message);

                //删除失败
                action?.Invoke(false);
            }
        });
    }


    /// <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
            {
                //通过一个线程执行这里面的逻辑 那么就不会影响主线程了
                //1.创建一个Ftp连接
                FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + fileName)) as FtpWebRequest;

                //2.进行一些设置
                //凭证
                ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                //是否操作结束后 关闭 控制连接
                ftpWebRequest.KeepAlive = false;
                //传输类型
                ftpWebRequest.UseBinary = true;
                //操作类型
                ftpWebRequest.Method = WebRequestMethods.Ftp.GetFileSize;
                //代理设置为空
                ftpWebRequest.Proxy = null;

                //3.真正的获取
                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                //把大小传递给外部 ContentLength是响应对象的字节的大小
                action?.Invoke(ftpWebResponse.ContentLength);

                ftpWebResponse.Close();
            }
            catch (Exception e)
            {
                Debug.Log("获取大小失败" + e.Message);
                action?.Invoke(0);
            }
        });
    }


    /// <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
            {
                //通过一个线程执行这里面的逻辑 那么就不会影响主线程了

                //1.创建一个Ftp连接
                FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;

                //2.进行一些设置
                //凭证
                ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                //是否操作结束后 关闭 控制连接
                ftpWebRequest.KeepAlive = false;
                //传输类型
                ftpWebRequest.UseBinary = true;
                //操作类型
                ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                //代理设置为空
                ftpWebRequest.Proxy = null;

                //3.真正的创建
                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                ftpWebResponse.Close();

                action?.Invoke(true);
            }
            catch (Exception e)
            {
                Debug.Log("创建文件夹失败" + e.Message);
                action?.Invoke(false);
            }
        });
    }

    /// <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
            {
                //通过一个线程执行这里面的逻辑 那么就不会影响主线程了

                //1.创建一个Ftp连接
                FtpWebRequest ftpWebRequest = FtpWebRequest.Create(new Uri(FTP_PATH + directoryName)) as FtpWebRequest;

                //2.进行一些设置
                //凭证
                ftpWebRequest.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
                //是否操作结束后 关闭 控制连接
                ftpWebRequest.KeepAlive = false;
                //传输类型
                ftpWebRequest.UseBinary = true;
                //操作类型
                ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                //代理设置为空
                ftpWebRequest.Proxy = null;

                //3.真正的创建
                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                //把下载的信息流 转换成StreamReader对象 方便我们一行一行的读取信息
                StreamReader streamReader = new StreamReader(ftpWebResponse.GetResponseStream());

                //用于存储文件名的列表
                List<string> nameStrs = new List<string>();
                //一行行的读取
                string line = streamReader.ReadLine();
                while (line != null)
                {
                    //文件名列表添加元素
                    nameStrs.Add(line);
                    //一行行的读取
                    line = streamReader.ReadLine();
                }
                ftpWebResponse.Close();

                action?.Invoke(nameStrs);
            }
            catch (Exception e)
            {
                Debug.Log("获取文件列表失败" + e.Message);
                action?.Invoke(null);
            }
        });
    }
}

Lesson45_网络通信_文件传输FTP_其他操作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson45_网络通信_文件传输FTP_其他操作 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 FTP其它操作指什么?

        //除了上传和下载,我们可能会对FTP服务器上的内容进行其它操作
        //比如:
        //1.删除文件
        //2.获取文件大小
        //3.创建文件夹
        //4.获取文件列表
        //等等

        #endregion

        #region 知识点二 进行其它操作

        //1.删除文件
        FtpManager.Instance.DeleteFile("MrTaoPic.png", (result) =>
        {
            print(result ? "删除成功" : "删除失败");
        });
        //假如服务器上没有指定删除的文件会报错

        //2.获取文件大小
        FtpManager.Instance.GetFileSize("pic.png", (size) =>
        {
            print("文件大小为:" + size);
        });

        //3.创建文件夹
        FtpManager.Instance.CreateDirectory("韬老狮", (result) =>
        {
            print(result ? "创建成功" : "创建失败");
        });
        //假如服务器上有指同名文件夹会报错

        //4.获取文件列表
        FtpManager.Instance.GetFileList("", (list) =>
        {
            if (list == null)
            {
                print("获取文件列表失败");
                return;
            }
            for (int i = 0; i < list.Count; i++)
            {
                print(list[i]);
            }
        });

        #endregion

        #region 总结

        //FTP对于我们的作用
        //1.游戏当中的一些上传和下载功能
        //2.原生AB包上传下载
        //3.上传下载一些语音内容

        //只要是上传下载相关的功能 都可以使用Ftp来完成

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏