背景
复制代码
1
2
3
4
5
6之所以用到发布程序,是因为当有多个项目多个团队成员时,如果手工通过FileZilla,有点麻烦并且容易出错 例如:要记忆和区分sftp的路径和密码,然后要手工选择文件,最后再复制 压缩 上传等,肯定会出错和遗漏 导入此机制的目的是: 通过程序界面,方便开发者发布编译好的应用,只需要选择好需要更新的文件和发布sftp目录后, 然后点发布按钮即可自动完成复制 压缩 上传到特定sftp目录的功能,也会自动更新数据库信息
程序界面
特别说明
复制代码
1
2
3
4
51. 需要更新的文件列表中不能有ICSharpCode.SharpZipLib.dll,因为自动更新程序会用到这个dll 如果包括了,则自动解压缩时会报错 2. 打开这个程序会自动定位到程序执行目录,当然可以手工或重新指定目录 3. 如果是发布到FTP,发布电脑不能有设置代理Proxy,否则会报错,就是上传不成功
程序逻辑
复制代码
1
2
3
4
5
6
71.首先配置好sftp,并保证磁盘空间Ok,提供的用户名密码等信息是正确的能够访问的 2.然后打开此发布APP的程序,自动获取项目名称和版本(我是把它集成到MES系统中的) 3.再选择不需要升级的文件点删除文件按钮,最后点发布即可,发布的逻辑是: 3.1 复制选择好的文件到项目名命名的文件夹,例如:MES 3.2 压缩项目名命名的文件夹,产生压缩文件,例如:MES.zip 3.3 上传压缩文件到SFTP服务器,并更新数据库相关Table
程序Load时的代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17DefaultAPPPath = Application.StartupPath;//获取程序执行时的路径 Label_APPName.Text = Application.ProductName;//获取应用程序名称或项目名称 Label_APPVersion.Text = Application.ProductVersion;//获取应用程序名称版本 TextBox_APPDesc.Text = "";//此基本是描述本次更新的内容 Label_Message.Text = ""; //Default第一个,此对应到sftp服务器上的文件夹名称 ComboBox_FolderPath.SelectedIndex = 0; //SelectedPath属性,比较重要的属性,它是获取你选择的文件夹的Default路径 folderBrowserDialog_SourceFiles.SelectedPath = DefaultAPPPath; //先清除List,然后把DefaultAPPPath中的所有文件List到ListBox中 ListBox_FileList.Items.Clear(); string[] FilesList = Directory.GetFiles(DefaultAPPPath, "MES*.*"); foreach (string TempFileName in FilesList) { ListBox_FileList.Items.Add(TempFileName); }
指定源目录按钮的代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//Description属性,可以在对话框提供说明、描述、提醒等信息 folderBrowserDialog_SourceFiles.Description = "指定应用程序升级文件所在的源目录"; //SelectedPath属性,比较重要的属性,它是获取你选择的文件夹的路径 folderBrowserDialog_SourceFiles.SelectedPath = DefaultAPPPath; if (folderBrowserDialog_SourceFiles.ShowDialog() == DialogResult.OK) { //先清除List ListBox_FileList.Items.Clear(); string[] FilesList = Directory.GetFiles(DefaultAPPPath, "MES*.*"); foreach (string TempFileName in FilesList) { ListBox_FileList.Items.Add(TempFileName); } }
删除文件按钮的代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19if (ListBox_FileList.SelectedIndices != null && ListBox_FileList.SelectedIndices.Count > 0) { List<int> FilesList = new List<int>(); foreach (int TempFileName in ListBox_FileList.SelectedIndices) { FilesList.Add(TempFileName); } FilesList.Sort(); FilesList.Reverse(); for (int i = 0; i < FilesList.Count; i++) { ListBox_FileList.Items.RemoveAt(FilesList[i]); } } else { Label_Message.Text = "请首先选定需要删除的文件!"; }
发布按钮的代码
复制代码
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
54Label_Message.Text = ""; //先把文件放在List中 List<string> FilesList = GetFilesList(); if (FilesList.Count > 0) { string UploadPath = ComboBox_FolderPath.Text;//sftp服务器文件夹路径 string APPDesc = string.IsNullOrEmpty(TextBox_APPDesc.Text.Trim()) ? "MES System" : TextBox_APPDesc.Text.Trim(); string APPName = Label_APPName.Text; string APPVersion = Label_APPVersion.Text; //因为我们编译后的程序都在Debug中,而我们要另外创建一个以APP命名的文件夹,所以需要替换,并把需要升级的文件放在此,然后再以此文件夹进行压缩 string APPPath = DefaultAPPPath.Replace("Debug", APPName); //如果不存在则创建 if (!Directory.Exists(APPPath)) { Directory.CreateDirectory(APPPath); } else { //还要先清空这个文件夹的内容 Directory.Delete(APPPath, true); Directory.CreateDirectory(APPPath); } //再把指定文件Copy到以应用程序命名的文件夹 CopyFilesToAPPDir(FilesList, APPPath); //自动压缩应用程序命名的文件夹,并指定压缩密码,要注意压缩和解压缩密码要一致 string ZipResult = ZipHelper.ZipDirectoryPWD(APPPath, APPName, "MESZIPPassword"); //只有压缩OK,才能上传动做 if (ZipResult == "OK") { //Upload sftp string ZipFile = APPPath + ".zip"; string ZipFileName = APPName + ".zip"; string UploadResult = UploadZIPByFTP(APPName, APPVersion, APPDesc, ZipFile, UploadPath, ZipFileName); if (UploadResult == "AP Upload Fail") { Label_Message.Text = UploadResult; } else { ListBox_FileList.Items.Clear(); Label_Message.Text = UploadResult; } } else { Label_Message.Text = "ZIP文件压缩异常!"; } } else { Label_Message.Text = "请添加要更新的文件!"; }
程序相关的代码
复制代码
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99//把ListBox中的内容放在List中 private List<string> GetFilesList() { List<string> FilesList = new List<string>(); foreach (object TempFileName in ListBox_FileList.Items) { FilesList.Add(TempFileName.ToString()); } return FilesList; } //复制文件列表到指定文件夹 private void CopyFilesToAPPDir(List<string> FilesList, string InAPPDir) { foreach (string TempFileName in FilesList) { //TempFileName=E:MySelfSourceSQLSugarAsp.NetMESbinDebugMES.exe if (File.Exists(TempFileName)) { int PathLeng = DefaultAPPPath.Length; string FileName = TempFileName.Substring(PathLeng + 1); //MES.exe if (FileName== "ICSharpCode.SharpZipLib.dll") { continue; } string TargetFile = InAPPDir + "\" + FileName; string TargetFileDir = Path.GetDirectoryName(TargetFile); if (!Directory.Exists(TargetFileDir)) { Directory.CreateDirectory(TargetFileDir); } File.Copy(TempFileName, TargetFile, true); } } } /*APPName APPVersion APPDesc 这三个很容易辨识 UploadPath 是ftp上的一个文件夹 Sample:MES ZIPFilePath是要上传的文件包括路径 e:MyAPPMESAPPName.zip ZIPFileName包括后缀的文件名称 APPName.zip */ private static string UploadZIPByFTP(string APPName,string APPVersion,string APPDesc,string ZIPFilePath,string UploadPath, string ZIPFileName) { string TempMessage="AP Upload Fail"; string VarAPPathName = ZIPFilePath; string ServerIPath = "10.64.32.99"; string FTPUser = "shsfc"; string FTPUserPWD = "Ambit123."; string UploadStatus = UploadFile(VarAPPathName, ZIPFileName, UploadPath, ServerIPath, FTPUser, FTPUserPWD); if (UploadStatus == "OK") { int UpdateResult = c_ap_Service.UpdateAPInfo(APPName, APPVersion, UploadPath, APPDesc); if (UpdateResult > 0) { TempMessage = "AP Upload and Update Info OK"; } else { TempMessage = "AP Upload Ok But Update Info Fail"; } } return TempMessage; } //這個UploadFile 驗證OK //PathFileName 包括文件名和后缀的完整路径 E:SFCMESMES.zip //FileName 文件名和后缀 MES.zip //文件上传到sftp的哪个文件夹 例如:MES // sftpServerIP 仅仅是sftp IP public static string UploadFile(string PathFileName, string FileName, string ftpPath, string sftpServerIP, string sftpUserID, string sftpUserPWD) { string LocalFileName = FileName;//SFTP服務器上的文件名和下載到本地的定義為一致 string LocalFullName = PathFileName;// E:SFCMESMES.zip string rndWorkPathName = ftpPath;// 例如:"MES" SFTP上MES相關程序所在文件夾 string RemoteFullPath = "/uploads/" + rndWorkPathName + "/" + LocalFileName;///uploads/MES/MES.zip using (var sftpclient = new SftpClient(sftpServerIP, sftpUserID, sftpUserPWD)) { sftpclient.Connect(); //切换指定目录(如果文件夾不存在,則會報:No such file) rndWorkPathName = "/uploads/" + rndWorkPathName + "/";// /uploads/MES/ sftpclient.ChangeDirectory("/uploads/");//切换目录 if (!sftpclient.Exists("MES")) { sftpclient.CreateDirectory("MES"); //此時在uploads文件夾中就有Backup文件夾了 /uploads/MES } sftpclient.ChangeDirectory(rndWorkPathName); using (var fileStream = new FileStream(LocalFullName, FileMode.Open)) { sftpclient.BufferSize = 8 * 1024; // bypass Payload error large //如果文件已經存在,則會覆蓋 sftpclient.UploadFile(fileStream, RemoteFullPath); fileStream.Close(); } sftpclient.Dispose(); } return "OK"; }
最后
以上就是鲜艳小笼包最近收集整理的关于C#发布应用程序PublishAPP By SFTP的全部内容,更多相关C#发布应用程序PublishAPP内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复