概述
背景
之所以用到发布程序,是因为当有多个项目多个团队成员时,如果手工通过FileZilla,有点麻烦并且容易出错
例如:要记忆和区分sftp的路径和密码,然后要手工选择文件,最后再复制 压缩 上传等,肯定会出错和遗漏
导入此机制的目的是:
通过程序界面,方便开发者发布编译好的应用,只需要选择好需要更新的文件和发布sftp目录后,
然后点发布按钮即可自动完成复制 压缩 上传到特定sftp目录的功能,也会自动更新数据库信息
程序界面
特别说明
1. 需要更新的文件列表中不能有ICSharpCode.SharpZipLib.dll,因为自动更新程序会用到这个dll
如果包括了,则自动解压缩时会报错
2. 打开这个程序会自动定位到程序执行目录,当然可以手工或重新指定目录
3. 如果是发布到FTP,发布电脑不能有设置代理Proxy,否则会报错,就是上传不成功
程序逻辑
1.首先配置好sftp,并保证磁盘空间Ok,提供的用户名密码等信息是正确的能够访问的
2.然后打开此发布APP的程序,自动获取项目名称和版本(我是把它集成到MES系统中的)
3.再选择不需要升级的文件点删除文件按钮,最后点发布即可,发布的逻辑是:
3.1 复制选择好的文件到项目名命名的文件夹,例如:MES
3.2 压缩项目名命名的文件夹,产生压缩文件,例如:MES.zip
3.3 上传压缩文件到SFTP服务器,并更新数据库相关Table
程序Load时的代码
DefaultAPPPath = 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);
}
指定源目录按钮的代码
//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);
}
}
删除文件按钮的代码
if (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 = "请首先选定需要删除的文件!";
}
发布按钮的代码
Label_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 = "请添加要更新的文件!";
}
程序相关的代码
//把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 By SFTP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复