背景
之所以用到发布程序,是因为当有多个项目多个团队成员时,如果手工通过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 = "";
ComboBox_FolderPath.SelectedIndex = 0;
folderBrowserDialog_SourceFiles.SelectedPath = DefaultAPPPath;
ListBox_FileList.Items.Clear();
string[] FilesList = Directory.GetFiles(DefaultAPPPath, "MES*.*");
foreach (string TempFileName in FilesList)
{
ListBox_FileList.Items.Add(TempFileName);
}
指定源目录按钮的代码
folderBrowserDialog_SourceFiles.Description = "指定应用程序升级文件所在的源目录";
folderBrowserDialog_SourceFiles.SelectedPath = DefaultAPPPath;
if (folderBrowserDialog_SourceFiles.ShowDialog() == DialogResult.OK)
{
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<string> FilesList = GetFilesList();
if (FilesList.Count > 0)
{
string UploadPath = ComboBox_FolderPath.Text;
string APPDesc = string.IsNullOrEmpty(TextBox_APPDesc.Text.Trim()) ? "MES System" : TextBox_APPDesc.Text.Trim();
string APPName = Label_APPName.Text;
string APPVersion = Label_APPVersion.Text;
string APPPath = DefaultAPPPath.Replace("Debug", APPName);
if (!Directory.Exists(APPPath))
{
Directory.CreateDirectory(APPPath);
}
else
{
Directory.Delete(APPPath, true);
Directory.CreateDirectory(APPPath);
}
CopyFilesToAPPDir(FilesList, APPPath);
string ZipResult = ZipHelper.ZipDirectoryPWD(APPPath, APPName, "MESZIPPassword");
if (ZipResult == "OK")
{
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 = "请添加要更新的文件!";
}
程序相关的代码
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)
{
if (File.Exists(TempFileName))
{
int PathLeng = DefaultAPPPath.Length;
string FileName = TempFileName.Substring(PathLeng + 1);
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);
}
}
}
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;
}
public static string UploadFile(string PathFileName, string FileName, string ftpPath, string sftpServerIP, string sftpUserID, string sftpUserPWD)
{
string LocalFileName = FileName;
string LocalFullName = PathFileName;
string rndWorkPathName = ftpPath;
string RemoteFullPath = "/uploads/" + rndWorkPathName + "/" + LocalFileName;
using (var sftpclient = new SftpClient(sftpServerIP, sftpUserID, sftpUserPWD))
{
sftpclient.Connect();
rndWorkPathName = "/uploads/" + rndWorkPathName + "/";
sftpclient.ChangeDirectory("/uploads/");
if (!sftpclient.Exists("MES"))
{
sftpclient.CreateDirectory("MES");
}
sftpclient.ChangeDirectory(rndWorkPathName);
using (var fileStream = new FileStream(LocalFullName, FileMode.Open))
{
sftpclient.BufferSize = 8 * 1024;
sftpclient.UploadFile(fileStream, RemoteFullPath);
fileStream.Close();
}
sftpclient.Dispose();
}
return "OK";
}