千家信息网

如何压缩备份C#

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍如何压缩备份C#,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!压缩备份C#虽然有源代码管理,但本着所有重要的计算机文件都要备份的原则,但我们仍然需要时常将程序整
千家信息网最后更新 2025年01月20日如何压缩备份C#

这篇文章主要介绍如何压缩备份C#,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

压缩备份C#

虽然有源代码管理,但本着所有重要的计算机文件都要备份的原则,但我们仍然需要时常将程序整体备份,一般的程序备份就是将程序目录整个的复制打包,里面可能存在很多垃圾文件,而且是手工操作,比较麻烦,于是我们程序员就想到编个小程序来备份程序了。为了使用方便这个程序还能挂靠到集成开发环境,方便随时调用。

一般的我们都是用VS.NET作为开发环境,因此这个小程序就要成为VS.NET的扩展程序。但编写VS.NET的扩展程序不是很方便,于是我们就想到更方便的扩展VS.NET的方法,那就是VBA.NET。

VBA.NET是扩展VS.NET的方法,是Office的VBA在VS.NET中的延续。使用方便,和VS.NET紧密结合,而且是解释运行,调试方便,而且其中的函数能绑定到VS.NET的工具条和菜单上面,调用方便。

现在说说压缩备份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文档。

C#工程XML文档中,从根节点出发,路径 VisualStudioProject/CSHARP/Build/Referencds/Reference 是指明工程使用的引用,也就是使用的DLL的文件名。而路径 VisualStudioProject/CSHARP/Files/Include/File 则列出了工程中包含的所有的文件。程序将利用这两个信息来获得要拷贝的文件。此时程序拷贝所得的是干净的C#项目,包含在C#项目目录下的其他文件就不拷贝了。

程序把文件拷贝到一个临时目录后就调用WinRar的命令行程序来压缩工程文件。如此完成压缩备份C#工程。

点击VS.NET的菜单项目"工具->宏->宏IDE",打开了VS.NET的VBA.NET的集成开发环境,编写代码,然后切换到VS.NET的IDE,在工具条上右击弹出快捷菜单,选择最下面的"自定义"菜单项目,切换到"命令"页面,在左边的列表中选择"宏",在右边的列表中选中刚刚写好的VBA.NET的函数,然后将其拖拽到VS.NET的工具条上,即可完成工具条按钮和VBA.NET函数的绑定,此后你只有点击这个按钮就能压缩备份你当前编辑的C#工程了,实在是太方便了.以下就是操作过程的演示录像.

完整的VBA.NET源代码为

  1. Public Sub CreateCSProjectRAR()

  2. If CheckCSProject() = False Then

  3. Return

  4. End If

  5. Dim strPath As String

  6. Dim myPrj As EnvDTE.Project = DTE.ActiveWindow.Project

  7. strPath = System.IO.Path.GetFileNameWithoutExtension(myPrj.FullName)

  8. Dim strFileName As String

  9. //设置要保存生成的文件的目录

  10. strPath = System.IO.Path.Combine
    ("D:\SourceBack", strPath & "[" & System.DateTime.Now.ToString("yyyy-MM-dd") & "]")

  11. strFileName = strPath & ".rar"

  12. If System.IO.File.Exists(strFileName) Then

  13. System.IO.File.Delete(strFileName)

  14. End If

  15. Dim iCount As Integer = CopyCSProjectFiles(strPath)

  16. If System.IO.File.Exists(strFileName) Then

  17. System.IO.File.Delete(strFileName)

  18. End If

  19. If iCount > 0 Then

  20. DTE.StatusBar.Text = "正在生成压缩文件"

  21. Dim start As New System.Diagnostics.ProcessStartInfo

  22. //此处指定 WinRar 压缩软件的可执行文件名,若 WinRar安装在其他的目录则修改此文件名

  23. start.FileName = "C:\Program Files\WinRAR\WinRAR.exe"

  24. start.Arguments = "a -r -df -ep1 " & strFileName & " " & strPath

  25. Dim p As SystemSystem.Diagnostics.Process = System.Diagnostics.Process.Start(start)

  26. p.WaitForExit()

  27. DTE.StatusBar.Text = "已生成压缩文件 " & strFileName

  28. MsgBox("已生成压缩文件 " & strFileName, MsgBoxStyle.Information, "系统提示")

  29. End If

  30. End Sub

  31. //将当前编辑的VS.NET2003的C#工程整体复制到用户指定的目录下,不支持VS.NET2005

  32. Public Sub CopyCSProject()

  33. //检查是否是C#工程

  34. If CheckCSProject() = False Then

  35. Return

  36. End If

  37. //让用户输入目录

  38. Dim strPath As String = InputBox("请输入输出目录名称", "输入")

  39. If strPath Is Nothing Then

  40. Return

  41. End If

  42. If strPath.Length = 0 Then

  43. Return

  44. End If

  45. //复制文件

  46. Dim iCount As Integer = CopyCSProjectFiles(strPath)

  47. MsgBox("共拷贝 " & iCount & " 个文件")

  48. End Sub

  49. //复制当前VS.NET2003的C#工程的所有包含的文件到指定的目录下,不支持VS.NET2005

  50. //不复制项目中使用绝对路径引用的文件

  51. Public Function CopyCSProjectFiles(ByVal strPath As String) As Integer

  52. If CheckCSProject() = False Then

  53. Return -1

  54. End If

  55. If System.IO.Directory.Exists(strPath) = False Then

  56. System.IO.Directory.CreateDirectory(strPath)

  57. End If

  58. Dim myPrj As EnvDTE.Project = DTE.ActiveWindow.Project

  59. //加载项目文件

  60. Dim myFile As New System.IO.StreamReader
    (myPrj.FullName, System.Text.Encoding.GetEncoding(936))

  61. Dim myDoc As New System.Xml.XmlDocument

  62. myDoc.LoadXml(myFile.ReadToEnd())

  63. myFile.Close()

  64. Dim ThisPath As String = System.IO.Path.GetDirectoryName(myPrj.FullName)

  65. //复制项目定义文件本身

  66. CopyFile(myPrj.FullName, strPath)

  67. Dim FileCount As Integer

  68. Dim myElement As System.Xml.XmlElement

  69. Dim strFileName As String

  70. Dim strNewFileName As String

  71. //复制引用的文件

  72. For Each myElement In myDoc.SelectNodes
    ("VisualStudioProject/CSHARP/Build/Referencds/Reference")

  73. strFileName = myElement.GetAttribute("HintPath")

  74. If System.IO.Path.IsPathRooted(strFileName) = False Then

  75. CopyFile(ThisPath, strPath, strFileName)

  76. FileCountFileCount = FileCount + 1

  77. End If

  78. Next

  79. //复制项目文件

  80. For Each myElement In myDoc.SelectNodes
    ("VisualStudioProject/CSHARP/Files/Include/File")

  81. strFileName = myElement.GetAttribute("RelPath")

  82. If Not strFileName Is Nothing Then

  83. If System.IO.Path.IsPathRooted(strFileName) = False Then

  84. CopyFile(ThisPath, strPath, strFileName)

  85. FileCountFileCount = FileCount + 1

  86. DTE.StatusBar.Text = FileCount & " 正在复制文件 " & strFileName

  87. End If

  88. End If

  89. Next

  90. Return FileCount

  91. End Function

  92. //检查当前编辑的工程是不是C#工程

  93. Public Function CheckCSProject() As Boolean

  94. Dim myPrj As EnvDTE.Project = DTE.ActiveWindow.Project

  95. If UCase(System.IO.Path.GetExtension(myPrj.FullName)) <> ".CSPROJ" Then

  96. MsgBox("当前工程不是 C# 工程", MsgBoxStyle.Information, "系统提示")

  97. Return False

  98. End If

  99. Return True

  100. End Function

  101. //创建指定的目录

  102. Public Sub CreateDirectory(ByVal strDir As String)

  103. If System.IO.Directory.Exists(strDir) = False Then

  104. System.IO.Directory.CreateDirectory(strDir)

  105. End If

  106. End Sub

  107. //将指定目录下的指定相对路径的文件复制到另一个目录,保持相对路径不变

  108. Public Sub CopyFile(ByVal strPath2 As String,
    ByVal strPath3 As String, ByVal strFilePath As String)

  109. Dim strName1 As String = System.IO.Path.Combine(strPath2, strFilePath)

  110. Dim strName2 As String = System.IO.Path.Combine(strPath3, strFilePath)

  111. Dim dir1 As String = System.IO.Path.GetDirectoryName(strName1)

  112. If System.IO.Directory.Exists(dir1) = False Then

  113. System.IO.Directory.CreateDirectory(dir1)

  114. End If

  115. Dim dir2 As String = System.IO.Path.GetDirectoryName(strName2)

  116. If System.IO.Directory.Exists(dir2) = False Then

  117. System.IO.Directory.CreateDirectory(dir2)

  118. End If

  119. System.IO.File.Copy(strName1, strName2, True)

  120. End Sub

  121. //复制指定的文件到指定的目录下

  122. Public Sub CopyFile(ByVal strFileName As String, ByVal strNewPath As String)

  123. System.IO.File.Copy(strFileName, System.IO.Path.Combine
    (strNewPath, System.IO.Path.GetFileName(strFileName)), True)

  124. End Sub

以上是"如何压缩备份C#"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0