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