溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何壓縮備份C#

發(fā)布時間:2021-12-01 11:11:56 來源:億速云 閱讀:122 作者:小新 欄目:編程語言

這篇文章主要介紹如何壓縮備份C#,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

壓縮備份C#

雖然有源代碼管理,但本著所有重要的計算機文件都要備份的原則,但我們?nèi)匀恍枰獣r常將程序整體備份,一般的程序備份就是將程序目錄整個的復(fù)制打包,里面可能存在很多垃圾文件,而且是手工操作,比較麻煩,于是我們程序員就想到編個小程序來備份程序了。為了使用方便這個程序還能掛靠到集成開發(fā)環(huán)境,方便隨時調(diào)用。

一般的我們都是用VS.NET作為開發(fā)環(huán)境,因此這個小程序就要成為VS.NET的擴展程序。但編寫VS.NET的擴展程序不是很方便,于是我們就想到更方便的擴展VS.NET的方法,那就是VBA.NET。

VBA.NET是擴展VS.NET的方法,是Office的VBA在VS.NET中的延續(xù)。使用方便,和VS.NET緊密結(jié)合,而且是解釋運行,調(diào)試方便,而且其中的函數(shù)能綁定到VS.NET的工具條和菜單上面,調(diào)用方便。

現(xiàn)在說說壓縮備份C#工程的流程。以下以VS.NET2003為例子進行說明,本文中的代碼也只能處理VS.NET2003的C#工程。用記事本打開一個VS.NET2003的C#工程文件(擴展名為 .csproj ),可以看到這是一個XML文件,但這個XML文件沒有XML聲明頭"<?xml version='1.0' encoding='編碼格式' ?>",但它的編碼格式是GB2312,而.NET框架加載XML文件時若沒有找到XML聲明頭則使用的默認編碼格式是UTF8,因此不能直接使用 System.XML.XmlDocument.Load 加載該文件。在此程序?qū)⑹褂肎B2312編碼格式(該編碼格式在.NET中的代碼為936)把C#工程文件當(dāng)作一個文本文件讀取其中所有的文本內(nèi)容,然后使用System.Xml.XmlDocument.LoadXml 加載XML文檔。

C#工程XML文檔中,從根節(jié)點出發(fā),路徑 VisualStudioProject/CSHARP/Build/Referencds/Reference 是指明工程使用的引用,也就是使用的DLL的文件名。而路徑 VisualStudioProject/CSHARP/Files/Include/File 則列出了工程中包含的所有的文件。程序?qū)⒗眠@兩個信息來獲得要拷貝的文件。此時程序拷貝所得的是干凈的C#項目,包含在C#項目目錄下的其他文件就不拷貝了。

程序把文件拷貝到一個臨時目錄后就調(diào)用WinRar的命令行程序來壓縮工程文件。如此完成壓縮備份C#工程。

點擊VS.NET的菜單項目"工具->宏->宏IDE",打開了VS.NET的VBA.NET的集成開發(fā)環(huán)境,編寫代碼,然后切換到VS.NET的IDE,在工具條上右擊彈出快捷菜單,選擇最下面的"自定義"菜單項目,切換到"命令"頁面,在左邊的列表中選擇"宏",在右邊的列表中選中剛剛寫好的VBA.NET的函數(shù),然后將其拖拽到VS.NET的工具條上,即可完成工具條按鈕和VBA.NET函數(shù)的綁定,此后你只有點擊這個按鈕就能壓縮備份你當(dāng)前編輯的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.  

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

  9.  

  10. Dim strFileName As String  

  11. //設(shè)置要保存生成的文件的目錄  

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

  13. strFileName = strPath & ".rar"  

  14.  

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

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

  17. End If  

  18. Dim iCount As Integer = CopyCSProjectFiles(strPath)  

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

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

  21. End If  

  22. If iCount > 0 Then  

  23. DTE.StatusBar.Text = "正在生成壓縮文件" 

  24. Dim start As New System.Diagnostics.ProcessStartInfo  

  25. //此處指定 WinRar 壓縮軟件的可執(zhí)行文件名,若 WinRar安裝在其他的目錄則修改此文件名  

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

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

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

  29. p.WaitForExit()  

  30. DTE.StatusBar.Text = "已生成壓縮文件 " & strFileName  

  31. MsgBox("已生成壓縮文件 " & strFileName, MsgBoxStyle.Information, "系統(tǒng)提示")  

  32. End If  

  33. End Sub  

  34.  

  35. //將當(dāng)前編輯的VS.NET2003的C#工程整體復(fù)制到用戶指定的目錄下,不支持VS.NET2005  

  36. Public Sub CopyCSProject()  

  37.  

  38. //檢查是否是C#工程  

  39. If CheckCSProject() = False Then  

  40. Return  

  41. End If  

  42. //讓用戶輸入目錄  

  43. Dim strPath As String = InputBox("請輸入輸出目錄名稱", "輸入")  

  44. If strPath Is Nothing Then  

  45. Return  

  46. End If  

  47. If strPath.Length = 0 Then  

  48. Return  

  49. End If  

  50. //復(fù)制文件  

  51. Dim iCount As Integer = CopyCSProjectFiles(strPath)  

  52.    

  53. MsgBox("共拷貝 " & iCount & " 個文件")  

  54.    

  55. End Sub  

  56.    

  57. //復(fù)制當(dāng)前VS.NET2003的C#工程的所有包含的文件到指定的目錄下,不支持VS.NET2005  

  58. //不復(fù)制項目中使用絕對路徑引用的文件  

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

  60.    

  61. If CheckCSProject() = False Then  

  62. Return -1  

  63. End If  

  64.    

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

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

  67. End If  

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

  69.    

  70. //加載項目文件  

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

  72. Dim myDoc As New System.Xml.XmlDocument  

  73. myDoc.LoadXml(myFile.ReadToEnd())  

  74. myFile.Close()  

  75.    

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

  77.    

  78. //復(fù)制項目定義文件本身  

  79. CopyFile(myPrj.FullName, strPath)  

  80.    

  81. Dim FileCount As Integer  

  82. Dim myElement As System.Xml.XmlElement  

  83. Dim strFileName As String  

  84. Dim strNewFileName As String  

  85. //復(fù)制引用的文件  

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

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

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

  89. CopyFile(ThisPath, strPath, strFileName)  

  90. FileCountFileCount = FileCount + 1  

  91. End If  

  92. Next  

  93.    

  94. //復(fù)制項目文件  

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

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

  97. If Not strFileName Is Nothing Then  

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

  99. CopyFile(ThisPath, strPath, strFileName)  

  100. FileCountFileCount = FileCount + 1  

  101. DTE.StatusBar.Text = FileCount & " 正在復(fù)制文件 " & strFileName  

  102. End If  

  103. End If  

  104. Next  

  105. Return FileCount  

  106. End Function  

  107.  

  108.  

  109. //檢查當(dāng)前編輯的工程是不是C#工程  

  110. Public Function CheckCSProject() As Boolean  

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

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

  113. MsgBox("當(dāng)前工程不是 C# 工程", MsgBoxStyle.Information, "系統(tǒng)提示")  

  114. Return False  

  115. End If  

  116. Return True  

  117. End Function  

  118.  

  119. //創(chuàng)建指定的目錄  

  120. Public Sub CreateDirectory(ByVal strDir As String)  

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

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

  123. End If  

  124. End Sub  

  125.  

  126. //將指定目錄下的指定相對路徑的文件復(fù)制到另一個目錄,保持相對路徑不變  

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

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

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

  130.  

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

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

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

  134. End If  

  135.  

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

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

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

  139. End If  

  140.  

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

  142.  

  143. End Sub  

  144.  

  145. //復(fù)制指定的文件到指定的目錄下  

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

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

  148. End Sub  

以上是“如何壓縮備份C#”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI