• 自动更新文件夹下所有DLL 至最新修改时间版本


      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Text;
      7 using System.Windows.Forms;
      8 using System.IO;
      9 using System.Diagnostics;
     10 
     11 namespace UpdateDllApplication1
     12 {
     13     public partial class Form1 : Form
     14     {
     15         // 思路:
     16         // 先建立一个表A 保存 所有DLL 位置 和 DLL 修改时间
     17         // 然后建立一个表B 保存 有最大修改时间的 DLL 位置 和 DLL 修改时间
     18         // 此两个表建立完成后 从表B 每个DLL 依次在 表A 找修改时间小于表B 同名DLL 的
     19         // 然后 复制 并写入到ListBox1!
     20 
     21         private bool Stop = false;
     22 
     23         private struct Filees
     24         {
     25             /// <summary>
     26             /// 路径+文件名
     27             /// </summary>
     28             public string FullName;
     29             /// <summary>
     30             /// 文件名
     31             /// </summary>
     32             public string FileName;
     33             /// <summary>
     34             /// 修改时间
     35             /// </summary>
     36             public DateTime ModifyTime;
     37         }
     38 
     39         public Form1()
     40         {
     41             InitializeComponent();
     42         }
     43 
     44         private void button1_Click(object sender, EventArgs e)
     45         {
     46             FolderBrowserDialog fd = new FolderBrowserDialog();
     47             fd.Description = "选择一个文件夹,此程序将更新此文件夹中所有DLL 至最新版本";
     48             fd.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);     //我的文档
     49             fd.ShowNewFolderButton = false;
     50             if (fd.ShowDialog(this) == DialogResult.OK)
     51             {
     52                 textBox1.Text = fd.SelectedPath;
     53             }
     54         }
     55 
     56         private void button2_Click(object sender, EventArgs e)
     57         {
     58             // 扫描文件夹中 DLL 位置 和 修改时间 并保存到两个表
     59             //  一个表里保存的全部
     60             //  另一表里保存的最新修改时间的 DLL 位置和时间
     61 
     62             // 下面代码有误 只能查当前文件夹,  正确写法需要递归
     63             List<Filees> A = new List<Filees>();
     64             List<Filees> B = new List<Filees>();
     65             // 切莫忘了清空 如果不需要即时清空 也要添加右键菜单的清空操作.
     66             listBox1.Items.Clear();
     67             string path = textBox1.Text.Trim();
     68             if (!string.IsNullOrEmpty(path) && Directory.Exists(path))
     69             {
     70                 SearchFiles(path, A, B);
     71             }
     72             // 开始修改
     73             bool checkVer = checkBox1.Checked;
     74             if (MessageBox.Show(this, "这样会修改很多文件,开始前需要确认", "提示") == DialogResult.OK)
     75             {
     76                 foreach (Filees item in A.ToArray())
     77                 {
     78                     if (Stop)
     79                         return;
     80                     foreach (Filees items in B.ToArray())
     81                     {
     82                         if (Stop)
     83                             return;
     84                         if (item.FileName == items.FileName)
     85                         {
     86                             if (!checkVer || (checkVer && ver(item.FullName) == ver(items.FullName)))  //检查版本号
     87                             {
     88                                 if (item.ModifyTime < items.ModifyTime)
     89                                 {
     90                                     listBox1.Items.Add(item.FullName);
     91                                     try
     92                                     {
     93                                         File.Copy(items.FullName, item.FullName, true);
     94                                     }
     95                                     catch (Exception ex)
     96                                     {
     97                                         listBox1.Items.Add(" 出错!!!!!!	" + ex.Message);
     98                                     }
     99                                 }
    100                             }
    101                         }
    102                     }
    103                 }
    104                 MessageBox.Show(this, "已完成!!!", "提示");
    105             }
    106         }
    107 
    108         private string ver(string path)
    109         {
    110             try
    111             {
    112                 return System.Reflection.Assembly.LoadFrom(path).GetName().Version.ToString();
    113             }
    114             catch (Exception ex)
    115             {
    116                 listBox1.Items.Add(" 出错!!!!!!		" + ex.Message);
    117                 return null;
    118             }
    119         }
    120 
    121         private void button3_Click(object sender, EventArgs e)
    122         {
    123             Stop = true;
    124         }
    125 
    126         private void SearchFiles(string path, List<Filees> A, List<Filees> B)
    127         {
    128             foreach (string item in Directory.GetFiles(path))
    129             {
    130                 if (item.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) && !item.Contains("Designer"))
    131                 {
    132                     Filees temp = new Filees();
    133                     temp.FullName = item;
    134                     temp.FileName = GetFileName(item);
    135                     temp.ModifyTime = File.GetLastWriteTime(item);
    136                     A.Add(temp);
    137                     //WriteToTxt("D:\1.txt", temp.FileName, temp.ModifyTime.ToString("yyyy-MM-dd HH:mm"));
    138                     //更新B
    139                     bool b = false;
    140                     foreach (Filees items in B.ToArray())
    141                     {
    142                         if (items.FileName == temp.FileName)
    143                         {
    144                             b = true;
    145                             if (items.ModifyTime < temp.ModifyTime)
    146                             {
    147                                 B.Remove(items);
    148                                 B.Add(temp);
    149                             }
    150                         }
    151                     }
    152                     if (!b)
    153                         B.Add(temp);
    154                 }
    155             }
    156             foreach (string item in Directory.GetDirectories(path))
    157             {
    158                 SearchFiles(item, A, B);
    159             }
    160         }
    161 
    162         void WriteToTxt(string path, string text, string time)
    163         {
    164             using (StreamWriter sw = new StreamWriter(path, true))
    165             {
    166                 sw.WriteLine(text + "	" + time);
    167                 sw.Close();
    168             }
    169         }
    170 
    171         /// <summary>
    172         /// 获取指定文件后缀名
    173         /// </summary>
    174         /// <param name="str">文件</param>
    175         /// <returns>待返回的路径名</returns>
    176         private string GetSuffix(string str)
    177         {
    178             string temp = str.Trim();
    179             if (string.IsNullOrEmpty(temp))
    180                 return "";
    181             temp = GetFileName(temp);
    182             int i = temp.LastIndexOf('.');
    183             if (i > -1)
    184                 return temp.Substring(i + 1);
    185             return "";
    186         }
    187 
    188         /// <summary>
    189         /// 获取指定路径文件名
    190         /// </summary>
    191         /// <param name="str">路径</param>
    192         /// <returns>待返回的文件名</returns>
    193         private string GetFileName(string str)
    194         {
    195             if (string.IsNullOrEmpty(str))
    196                 return "";
    197             int i = str.LastIndexOf('\');
    198             return str.Substring(i + 1);
    199         }
    200 
    201         /// <summary>
    202         /// 获取字符串中路径
    203         /// </summary>
    204         /// <param name="str">字符串</param>
    205         /// <returns>待返回的路径</returns>
    206         private string GetFullPath(string str)
    207         {
    208             if (string.IsNullOrEmpty(str))
    209                 return "";
    210             int i = str.LastIndexOf('\');
    211             return str.Substring(0, i);
    212         }
    213 
    214         private void clearToolStripMenuItem_Click(object sender, EventArgs e)
    215         {
    216             listBox1.Items.Clear();
    217         }
    218 
    219         private void listBox1_MouseDown(object sender, MouseEventArgs e)
    220         {
    221             // 此代码有错,当出现滚动条时 就会选错
    222             if (e.Button == MouseButtons.Right)
    223             {
    224                 int i = e.Y / listBox1.ItemHeight;
    225                 listBox1.SelectedIndex = i < listBox1.Items.Count ? i : listBox1.Items.Count - 1;
    226             }
    227         }
    228 
    229         private void copyToolStripMenuItem_Click(object sender, EventArgs e)
    230         {
    231             Clipboard.Clear();
    232             Clipboard.SetText("" + (listBox1.SelectedIndex + 1).ToString() + "" + listBox1.SelectedItem.ToString());
    233         }
    234 
    235         private void toTxtToolStripMenuItem_Click(object sender, EventArgs e)
    236         {
    237             SaveFileDialog fd = new SaveFileDialog();
    238             fd.FileName = "D:\1.txt";
    239             fd.Filter = "文本文件|*.txt|全部文件|*.*";
    240             if (fd.ShowDialog() == DialogResult.OK)
    241             {
    242                 using (StreamWriter sw = new StreamWriter(fd.FileName, false))
    243                 {
    244                     foreach (string item in listBox1.Items)
    245                     {
    246                         sw.WriteLine(item);
    247                     }
    248                     sw.Close();
    249                 }
    250             }
    251         }
    252 
    253         private void listBox1_DoubleClick(object sender, EventArgs e)
    254         {
    255             try
    256             {
    257                 Process.Start("Explorer.exe", GetFullPath(listBox1.SelectedItem.ToString()));
    258             }
    259             catch
    260             {
    261                 MessageBox.Show(this, "这个路径不合法!
    
    无法打开所在文件夹!", "提示");
    262             }
    263         }
    264 
    265         private void button4_Click(object sender, EventArgs e)
    266         {
    267             // 扫描文件夹中 DLL 位置 和 修改时间 并保存到两个表
    268             //  一个表里保存的全部
    269             //  另一表里保存的最新修改时间的 DLL 位置和时间
    270 
    271             //私有变量 目的是减少内存占用 或者说减少出错。
    272             List<Filees> A = new List<Filees>();
    273             List<Filees> B = new List<Filees>();
    274             // 切莫忘了清空 如果不需要即时清空 也要添加右键菜单的清空操作.
    275             listBox1.Items.Clear();
    276             string path = textBox1.Text.Trim();
    277             if (!string.IsNullOrEmpty(path) && Directory.Exists(path))
    278             {
    279                 SearchFiles(path, A, B);
    280             }
    281             bool checkVer = checkBox1.Checked;
    282             foreach (Filees item in A.ToArray())
    283             {
    284                 foreach (Filees items in B.ToArray())
    285                 {
    286                     if (item.FileName == items.FileName)
    287                     {
    288                         if (!checkVer || (checkVer && ver(item.FullName) == ver(items.FullName)))  //检查版本号
    289                         {
    290                             if (File.GetLastWriteTime(item.FullName) < File.GetLastWriteTime(items.FullName))
    291                             {
    292                                 listBox1.Items.Add(item.FullName + "	修改时间:" + item.ModifyTime + "	最新时间:" + items.ModifyTime);
    293                             }
    294                         }
    295                     }
    296                 }
    297             }
    298             if (listBox1.Items.Count == 0)
    299                 listBox1.Items.Add("已扫描完成,Dll无需更新!");
    300         }
    301     }
    302 }
  • 相关阅读:
    [C++]C++11右值引用
    [cocos2d-x]registerScriptHandler和registerScriptTapHandler区别
    [深度探索C++对象模型]关于成员初始化列表(member initiallization list)
    [深度探索C++对象模型]memcpy和memset注意事项
    sql server isnull函数
    sql server 数据类型
    sql server SQL 服务器
    案例:按钮拖动移动
    PHP 随笔记
    laravel5 事务回滚
  • 原文地址:https://www.cnblogs.com/z5337/p/3372569.html
Copyright © 2020-2023  润新知