我是靠谱客的博主 鲜艳小笼包,最近开发中收集的这篇文章主要介绍C#发布应用程序PublishAPP By SFTP,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景

之所以用到发布程序,是因为当有多个项目多个团队成员时,如果手工通过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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部