且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Unity3D下用C#通过WinSCP命令行方式给Linux服务器SCP传文件

更新时间:2022-10-02 19:49:43

遇到一个需求是在Unity3D做编辑器工具时需要把生成的AssetBundle包上传到资源服务器,资源服务器用的Linux。

实现分为三部分:1,C#上传工具类;2,WinSCP脚本;3,传参调用使用上传功能。


1,C#上传工具类

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using UnityEngine;
using System.Collections;
using System.IO;
using System;
using System.Diagnostics;
 
public class UploadHelper
{
 
    public static void callUploadProcess(string arguments)
    {
 
        string winScpPath = Directory.GetParent(Application.dataPath) + "/WinSCP/WinSCP.exe";
 
        try
        {
            Process proc = null;
 
            bool redirectOutput = false;
 
            proc = new Process();
            proc.StartInfo.FileName = winScpPath;
            proc.StartInfo.Arguments = arguments;
 
            if (redirectOutput)
            {
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.CreateNoWindow = true;
            }
            else
            {
                proc.StartInfo.CreateNoWindow = false;
            }
            proc.Start();
 
            if (redirectOutput)
            {
                //重定向,显示上传工具输出
                StreamReader sr = proc.StandardOutput;
                while (!sr.EndOfStream)
                {
                    string s = sr.ReadLine();
                    UnityEngine.Debug.Log(s);
                }
            }
 
            proc.WaitForExit();
 
            if (proc.ExitCode == 0)
            {
                UnityEngine.Debug.LogFormat("[{0}] 上传完毕!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            else
            {
                UnityEngine.Debug.LogFormat("[{0}] 上传失败! ExitCode:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), proc.ExitCode);
            }
 
        }
        catch (Exception ex)
        {
            UnityEngine.Debug.LogError(String.Format("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString()));
        }
    }
}

2,WinSCP脚本,

1
UploadAssetBundles.script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
option echo off
option batch on
option confirm off
 
open scp://"%1%":"%2%"@"%3%"
 
option transfer binary
synchronize remote -mirror -delete %4% %5%
 
chmod 755 %5%/*
 
close
 
exit

3,C#程序内传参调用实现上传功能

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
43
private static void UploadToServer(BuildTarget target)
    {
        string remoteFolder = null;//远程服务器资源所在路径
        switch (target)
        {
            case BuildTarget.StandaloneWindows64:
                remoteFolder = "###/AssetBundle/PC";
                break;
            case BuildTarget.Android:
                remoteFolder = "###/AssetBundle/Android";
                break;
            case BuildTarget.iOS:
                remoteFolder = "###/AssetBundle/iOS";
                break;
            default:
                return;
        }
 
        string uploaderPath = Application.dataPath + "/Uploader";
 
        //脚本路径
        string scriptPath = uploaderPath + "/UploadAssetBundles.script";
 
        //Log路径
        string logPath = Directory.GetParent(Application.dataPath) + "/upload.log";
 
        string localFolder = Application.dataPath + "/ABs";//本地资源目录路径
 
        string[] param ={
                "test",//远程服务器登录用户名
                "test1234",//远程服务器登录密码                
                "192.168.1.xxx",//远程服务器IP或域名                
                localFolder,
                remoteFolder,
                scriptPath,
                logPath,
            };
 
        string arguments = String.Format("/console /log={6} /script={5} /parameter \"{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\"", param);
 
        UploadHelper.callUploadProcess(arguments);
 
    }

arguments最后的

1
/parameter \"{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\""

是传给WinSCP脚本的参数,对应脚本里的“%1%”到“%5%”.



关于WinSCP命令行调用说明可以查看官网https://winscp.net/eng/docs/scripting

WinSCP可以在这下载:http://down.51cto.com/data/2304295

本文转自   zl1030   51CTO博客,原文链接:http://blog.51cto.com/zl1030/1920820