Unity C# 网络学习(六)——FTP(二)

Unity C# 网络学习(六)——FTP(二)

一.FTP下载

public class Lesson14 : MonoBehaviour
{
    
    
    private void Start()
    {
    
    
        NetworkCredential networkCredential = new NetworkCredential("zzs", "zzzsss123");

        FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri("ftp://127.0.0.1/1.jpg")) as FtpWebRequest;
        if (ftpWebRequest == null)
            return;
        ftpWebRequest.Credentials = networkCredential;
        ftpWebRequest.Proxy = null;
        ftpWebRequest.KeepAlive = false;
        ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
        ftpWebRequest.UseBinary = true;

        FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
        Stream stream = ftpWebResponse?.GetResponseStream();
        if (stream == null)
            return;
        string path = Application.persistentDataPath + "/copy1.jpg";
        using (FileStream fs = new FileStream(path,FileMode.Create))
        {
    
    
            byte[] buffer = new byte[1024];
            int len = stream.Read(buffer,0,buffer.Length);
            while (len > 0)
            {
    
    
                fs.Write(buffer,0,len);
                len = stream.Read(buffer,0,buffer.Length);
            }
        }
        stream.Close();
        Debug.Log("下载完成!");
    }
}

二.FTP下载封装

1.协程实现

    public void UpLoadFileMono(string fileName, string path, Action action = null)
    {
    
    
        StartCoroutine(UpLoadFile(fileName, path, action));
    }
    private IEnumerator UpLoadFile(string fileName, string path, Action action = null)
    {
    
    
        NetworkCredential networkCredential = new NetworkCredential(UserName, Password);
        FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL) + fileName) as FtpWebRequest;
        if (ftpWebRequest == null)
            yield break;
        ftpWebRequest.Credentials = networkCredential;
        ftpWebRequest.Proxy = null;
        ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
        ftpWebRequest.KeepAlive = false;
        ftpWebRequest.UseBinary = true;

        Stream ftpRequestStream = ftpWebRequest.GetRequestStream();

        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
    
    
            byte[] buffer = new byte[10240];
            int length = fs.Read(buffer, 0, buffer.Length);
            while (length > 0)
            {
    
    
                ftpRequestStream.Write(buffer, 0, length);
                length = fs.Read(buffer, 0, buffer.Length);
                yield return null;
            }
        }
		ftpWebResponse.Close();
        ftpRequestStream.Close();
        action?.Invoke();
    }

2.Task多线程实现

    public async void DownLoadAsync(string downLoadFileName, string outPath, Action action = null)
    {
    
    
        await Task.Run(() =>
        {
    
    
            NetworkCredential networkCredential = new NetworkCredential(UserName, Password);

            FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL + downLoadFileName)) as FtpWebRequest;
            if (ftpWebRequest == null)
                return;
            ftpWebRequest.Credentials = networkCredential;
            ftpWebRequest.Proxy = null;
            ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            ftpWebRequest.KeepAlive = false;
            ftpWebRequest.UseBinary = true;

            FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
            Stream stream = ftpWebResponse?.GetResponseStream();
            if (stream == null)
                return;
            using (FileStream fs = new FileStream(outPath, FileMode.Create))
            {
    
    
                byte[] buffer = new byte[10240];
                int len = stream.Read(buffer, 0, buffer.Length);
                while (len > 0)
                {
    
    
                    fs.Write(buffer, 0, len);
                    len = stream.Read(buffer, 0, buffer.Length);
                }
            }
            ftpWebResponse.Close();
            stream.Close();
            action?.Invoke();
        });
    }

三.FTP的其它操作

1.删除文件

    public async void DeleteFile(string deleteFileName,Action<bool> action = null)
    {
    
    
        await Task.Run(() =>
        {
    
    
            try
            {
    
    
                NetworkCredential networkCredential = new NetworkCredential(UserName, Password);

                FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL + deleteFileName)) as FtpWebRequest;
                if (ftpWebRequest == null)
                {
    
    
                    action?.Invoke(false);
                    return;                    
                }
                ftpWebRequest.Credentials = networkCredential;
                ftpWebRequest.Proxy = null;
                ftpWebRequest.Method = WebRequestMethods.Ftp.DeleteFile;
                ftpWebRequest.KeepAlive = false;
                ftpWebRequest.UseBinary = true;

                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                if (ftpWebResponse == null)
                {
    
    
                    action?.Invoke(false);
                    return;
                }
                action?.Invoke(true);
                ftpWebResponse.Close();
            }
            catch (Exception e)
            {
    
    
                action?.Invoke(false);
                Debug.Log("删除文件失败:"+e);
            }
        });
    }

2.获取文件大小

    public async void GetFileSize(string fileName, Action<long> action = null)
    {
    
    
        await Task.Run(() =>
        {
    
    
            try
            {
    
    
                NetworkCredential networkCredential = new NetworkCredential(UserName, Password);

                FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL + fileName)) as FtpWebRequest;
                if (ftpWebRequest == null)
                {
    
    
                    action?.Invoke(0);
                    return;                    
                }
                ftpWebRequest.Credentials = networkCredential;
                ftpWebRequest.Proxy = null;
                ftpWebRequest.Method = WebRequestMethods.Ftp.GetFileSize;
                ftpWebRequest.KeepAlive = false;
                ftpWebRequest.UseBinary = true;

                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                if (ftpWebResponse == null)
                {
    
    
                    action?.Invoke(0);
                    return;
                }
                action?.Invoke(ftpWebResponse.ContentLength);
                ftpWebResponse.Close();
            }
            catch (Exception e)
            {
    
    
                action?.Invoke(0);
                Debug.Log("获取文件大小失败:"+e);
            }
        });
    }

3.创建文件夹

    public async void CreateDir(string dirName, Action<bool> action = null)
    {
    
    
        await Task.Run(() =>
        {
    
    
            try
            {
    
    
                NetworkCredential networkCredential = new NetworkCredential(UserName, Password);

                FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(FtpURL + dirName)) as FtpWebRequest;
                if (ftpWebRequest == null)
                {
    
    
                    action?.Invoke(false);
                    return;                    
                }
                ftpWebRequest.Credentials = networkCredential;
                ftpWebRequest.Proxy = null;
                ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                ftpWebRequest.KeepAlive = false;
                ftpWebRequest.UseBinary = true;

                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                if (ftpWebResponse == null)
                {
    
    
                    action?.Invoke(false);
                    return;
                }
                action?.Invoke(true);
                ftpWebResponse.Close();
            }
            catch (Exception e)
            {
    
    
                action?.Invoke(false);
                Debug.Log("创建文件夹失败:"+e);
            }
        });
    }

4.获取文件列表

    public async void GetDirList(string dirName, Action<List<string>> action = null)
    {
    
    
        //记得文件夹名称后面要加'/'
        //记得文件夹名称后面要加'/'
        //记得文件夹名称后面要加'/'
        await Task.Run(() =>
        {
    
    
            try
            {
    
    
                NetworkCredential networkCredential = new NetworkCredential(UserName, Password);
                string p = FtpURL + dirName +"/";
                FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(p)) as FtpWebRequest;
                if (ftpWebRequest == null)
                {
    
    
                    action?.Invoke(null);
                    return;                    
                }
                ftpWebRequest.Credentials = networkCredential;
                ftpWebRequest.Proxy = null;
                ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                ftpWebRequest.KeepAlive = false;
                ftpWebRequest.UseBinary = true;

                FtpWebResponse ftpWebResponse = ftpWebRequest.GetResponse() as FtpWebResponse;
                if (ftpWebResponse == null)
                {
    
    
                    action?.Invoke(null);
                    return;
                }
                Stream s = ftpWebResponse.GetResponseStream();
                if (s == null)
                {
    
    
                    action?.Invoke(null);
                    return;
                }
                
                List<string> res = new List<string>();
                using (StreamReader sr = new StreamReader(s))
                {
    
    
                    string str = sr.ReadLine();
                    while (str != null)
                    {
    
    
                        res.Add(str);
                        str = sr.ReadLine();
                    }
                }
                s.Close();
                action?.Invoke(res);
                ftpWebResponse.Close();
            }
            catch (Exception e)
            {
    
    
                action?.Invoke(null);
                Debug.Log("获取文件列表失败:"+e);
            }
        });
    }
  • 其余操作同理

猜你喜欢

转载自blog.csdn.net/zzzsss123333/article/details/125441272
今日推荐