使用VBA.NET压缩备份C#工程

介绍如何使用VBA.NET编写程序自动备份VS.NET2003的C#项目,并压缩成RAR文件,包括复制所需文件和调用WinRar进行压缩。
导读:
  
  虽然有源代码管理,但本着所有重要的计算机文件都要备份的原则,但我们仍然需要时常将程序整体备份,一般的程序备份就是将程序目录整个的复制打包,里面可能存在很多垃圾文件,而且是手工操作,比较麻烦,于是我们程序员就想到编个小程序来备份程序了。为了使用方便这个程序还能挂靠到集成开发环境,方便随时调用。 bitsCN~com
  一般的我们都是用VS.NET作为开发环境,因此这个小程序就要成为VS.NET的扩展程序。但编写VS.NET的扩展程序不是很方便,于是我们就想到更方便的扩展VS.NET的方法,那就是VBA.NET。
  bitsCN~com
  VBA.NET是扩展VS.NET的方法,是Office的VBA在VS.NET中的延续。使用方便,和VS.NET紧密结合,而且是解释运行,调试方便,而且其中的函数能绑定到VS.NET的工具条和菜单上面,调用方便。 bitsCN#com中国网管联盟
  现在说说压缩备份C#工程的流程。以下以VS.NET2003为例子进行说明,本文中的代码也只能处理VS.NET2003的C#工程。用记事本打开一个VS.NET2003的C#工程文件(扩展名为 .csproj ),可以看到这是一个XML文件,但这个XML文件没有XML声明头" ",但它的编码格式是GB2312,而.NET框架加载XML文件时若没有找到XML声明头则使用的默认编码格式是UTF8,因此不能直接使用 System.XML.XmlDocument.Load加载该文件。在此程序将使用GB2312编码格式(该编码格式在.NET中的代码为936)把C#工程文件当作一个文本文件读取其中所有的文本内容,然后使用System.Xml.XmlDocument.LoadXml加载XML文档。 www@bitscn@com
  C#工程XML文档中,从根节点出发,路径 VisualStudioProject/CSHARP/Build/Referencds/Reference是指明工程使用的引用,也就是使用的DLL的文件名。而路径 VisualStudioProject/CSHARP/Files/Include/File则列出了工程中包含的所有的文件。程序将利用这两个信息来获得要拷贝的文件。此时程序拷贝所得的是干净的C#项目,包含在C#项目目录下的其他文件就不拷贝了。
  bitsCN.nET*中国网管博客
  程序把文件拷贝到一个临时目录后就调用WinRar的命令行程序来压缩工程文件。如此完成压缩备份C#工程。
  [bitsCN.Com]
  点击VS.NET的菜单项目"工具->宏->宏IDE",打开了VS.NET的VBA.NET的集成开发环境,编写代码,然后切换到VS.NET的IDE,在工具条上右击弹出快捷菜单,选择最下面的"自定义"菜单项目,切换到"命令"页面,在左边的列表中选择"宏",在右边的列表中选中刚刚写好的VBA.NET的函数,然后将其拖拽到VS.NET的工具条上,即可完成工具条按钮和VBA.NET函数的绑定,此后你只有点击这个按钮就能压缩备份你当前编辑的C#工程了,实在是太方便了.以下就是操作过程的演示录像.
  bbs.bitsCN.com
  完整的VBA.NET源代码为
  www@bitscn@com
  1 ' 将当前编辑的VS.NET2003的C#工程整体压缩备份,不支持VS.NET2005
  2 ' 本函数调用 WinRar 软件进行压缩,因此计算机系统必须安装 WinRar
  3 ' 程序编制 袁永福(http://www.xdesigner.cn) 2007-8-7 中国_网管联盟bitsCN.com 4 Public Sub CreateCSProjectRAR() 5 If CheckCSProject() = False Then
  6 ReturnBBS.bitsCN.com网管论坛 7 End If
  8 Dim strPath As String
  9 Dim myPrj As EnvDTE.Project = DTE.ActiveWindow.Project www_bitscn_com中国.网管联盟 10
  11 strPath = System.IO.Path.GetFileNameWithoutExtension(myPrj.FullName) 12
  13 Dim strFileName As String
  14 ' 设置要保存生成的文件的目录BBS.bitsCN.com网管论坛 15 strPath = System.IO.Path.Combine("D:/SourceBack", strPath & "[" & System.DateTime.Now.ToString("yyyy-MM-dd") & "]")
  www_bitscn_com中国.网管联盟 16 strFileName = strPath & ".rar"
  17
  18 If System.IO.File.Exists(strFileName) Then
  19 System.IO.File.Delete(strFileName)
  [bitsCN_com] 20 End If
  21 Dim iCount As Integer = CopyCSProjectFiles(strPath) 22 If System.IO.File.Exists(strFileName) ThenBBS.bitsCN.com网管论坛 23 System.IO.File.Delete(strFileName) 24 End If
  25 If iCount > 0 Then
  26 DTE.StatusBar.Text = "正在生成压缩文件
  
  "bbs.bitsCN.com中国网管论坛 27 Dim start As New System.Diagnostics.ProcessStartInfo 28 ' 此处指定 WinRar 压缩软件的可执行文件名,若 WinRar安装在其他的目录则修改此文件名
  29 start.FileName = "C:/Program Files/WinRAR/WinRAR.exe"bitsCN.nET*中国网管博客 30 start.Arguments = "a -r -df -ep1 " & strFileName & " " & strPath 31 Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(start)
  bitsCN#com中国网管联盟 32 p.WaitForExit() 33 DTE.StatusBar.Text = "已生成压缩文件 " & strFileName 34 MsgBox("已生成压缩文件 " & strFileName, MsgBoxStyle.Information, "系统提示")
  BBS.bitsCN.com网管论坛 35 End If
  36 End Sub
  37
  38 ' 将当前编辑的VS.NET2003的C#工程整体复制到用户指定的目录下,不支持VS.NET2005
  39 Public Sub CopyCSProject() 中国_网管联盟bitsCN.com 40
  41 ' 检查是否是C#工程
  42 If CheckCSProject() = False Then
  43 Return[bitsCN_com] 44 End If
  45 ' 让用户输入目录
  46 Dim strPath As String = InputBox("请输入输出目录名称", "输入")
  [bitsCN_com] 47 If strPath Is Nothing Then
  48 Return
  49 End If
  50 If strPath.Length = 0 Thenbbs.bitsCN.com 51 Return
  52 End If
  53 ' 复制文件
  54 Dim iCount As Integer = CopyCSProjectFiles(strPath)
  BBS.bitsCN.com网管论坛 55
  56 MsgBox("共拷贝 " & iCount & " 个文件") 57
  58 End Sub[bitsCN_com] 59
  60 ' 复制当前VS.NET2003的C#工程的所有包含的文件到指定的目录下,不支持VS.NET2005
  61 ' 不复制项目中使用绝对路径引用的文件
  62 Public Function CopyCSProjectFiles(ByVal strPath As String) As Integerwww@bitscn@com 63
  64 If CheckCSProject() = False Then
  65 Return -1
  66 End If[bitsCN.Com] 67
  68 If System.IO.Directory.Exists(strPath) = False Then
  69 System.IO.Directory.CreateDirectory(strPath) 70 End IfbitsCN#com中国网管联盟 71 Dim myPrj As EnvDTE.Project = DTE.ActiveWindow.Project 72
  73 ' 加载项目文件
  74 Dim myFile As New System.IO.StreamReader(myPrj.FullName, System.Text.Encoding.GetEncoding(936))
  BBS.bitsCN.com网管论坛 75 Dim myDoc As New System.Xml.XmlDocument 76 myDoc.LoadXml(myFile.ReadToEnd()) 77 myFile.Close() 78
  79 Dim ThisPath As String = System.IO.Path.GetDirectoryName(myPrj.FullName)
  [bitsCN_com] 80
  81 ' 复制项目定义文件本身
  82 CopyFile(myPrj.FullName, strPath) 83
  84 Dim FileCount As Integer中国_网管联盟bitsCN.com 85 Dim myElement As System.Xml.XmlElement 86 Dim strFileName As String
  87 Dim strNewFileName As StringDL@bitsCN_com网管软件下载 88 ' 复制引用的文件
  89 For Each myElement In myDoc.SelectNodes("VisualStudioProject/CSHARP/Build/Referencds/Reference") 90 strFileName = myElement.GetAttribute("HintPath") www@bitscn@com 91 If System.IO.Path.IsPathRooted(strFileName) = False Then
  92 CopyFile(ThisPath, strPath, strFileName) 93 FileCount = FileCount + 1bbs.bitsCN.com 94 End If
  95 Next
  96
  97 ' 复制项目文件
  98 For Each myElement In myDoc.SelectNodes("VisualStudioProject/CSHARP/Files/Include/File") bitsCN~com 99 strFileName = myElement.GetAttribute("RelPath")100 If Not strFileName Is Nothing Then
  101 If System.IO.Path.IsPathRooted(strFileName) = False ThenDL@bitsCN_com网管软件下载102 CopyFile(ThisPath, strPath, strFileName)103 FileCount = FileCount + 1
  104 DTE.StatusBar.Text = FileCount & " 正在复制文件 " & strFileName [bitsCN_com]105 End If
  106 End If
  107 Next
  108 Return FileCount
  www@bitscn@com109 End Function
  110
  111
  112 ' 检查当前编辑的工程是不是C#工程
  113 Public Function CheckCSProject() As Boolean[bitsCN_com]114 Dim myPrj As EnvDTE.Project = DTE.ActiveWindow.Project115 If UCase(System.IO.Path.GetExtension(myPrj.FullName)) <> ".CSPROJ" ThenDL@bitsCN_com网管软件下载116 MsgBox("当前工程不是 C# 工程", MsgBoxStyle.Information, "系统提示")117 Return False
  118 End Ifbbs.bitsCN.com中国网管论坛119 Return True
  120 End Function
  121
  122 ' 创建指定的目录
  123 Public Sub CreateDirectory(ByVal strDir As String) bitsCN~com124 If System.IO.Directory.Exists(strDir) = False Then
  125 System.IO.Directory.CreateDirectory(strDir)126 End If
  127 End Subwww_bitscn_com中国.网管联盟128
  129 ' 将指定目录下的指定相对路径的文件复制到另一个目录,保持相对路径不变
  130 Public Sub CopyFile(ByVal strPath1 As String, ByVal strPath2 As String, ByVal strFilePath As String)
  www@bitscn@com131 Dim strName1 As String = System.IO.Path.Combine(strPath1, strFilePath)132 Dim strName2 As String = System.IO.Path.Combine(strPath2, strFilePath) 中国_网管联盟bitsCN.com133
  134 Dim dir1 As String = System.IO.Path.GetDirectoryName(strName1)135 If System.IO.Directory.Exists(dir1) = False Then中国_网管联盟bitsCN.com136 System.IO.Directory.CreateDirectory(dir1)137 End If
  138
  139 Dim dir2 As String = System.IO.Path.GetDirectoryName(strName2) bitsCN#com中国网管联盟140 If System.IO.Directory.Exists(dir2) = False Then
  141 System.IO.Directory.CreateDirectory(dir2)142 End If
  143 bitsCN~com144 System.IO.File.Copy(strName1, strName2, True)145
  146 End Sub
  147
  148 ' 复制指定的文件到指定的目录下
  149 Public Sub CopyFile(ByVal strFileName As String, ByVal strNewPath As String) DL@bitsCN_com网管软件下载150 System.IO.File.Copy(strFileName, System.IO.Path.Combine(strNewPath, System.IO.Path.GetFileName(strFileName)), True)151 End Sub

本文转自
http://www.bitscn.com/dotnet/c/200709/109571.html
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值