You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Program.cs 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. 
  2. // =================================================================== //
  3. // This is a tool to split the native .so file of linux gpu library //
  4. // =================================================================== //
  5. using System.Security.Cryptography;
  6. string filename = "libtensorflow.so";
  7. int count = 5;
  8. SplitFile(filename, count);
  9. static void SplitFile(string filename, int count)
  10. {
  11. // 打开读取二进制文件的文件流
  12. using (FileStream input = new FileStream(filename, FileMode.Open, FileAccess.Read))
  13. {
  14. long filesize = new FileInfo(filename).Length; // 获取文件大小
  15. long fragmentSize = (long)(filesize / count + 1); // 计算每个分片的大小
  16. byte[] buffer = new byte[fragmentSize]; // 设置缓冲区大小
  17. int bytesRead; // 存储读取长度
  18. int fragmentIndex = 1; // 分片计数器
  19. // 使用循环遍历分片并写入相应的文件
  20. while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
  21. {
  22. string outputFileName = $"{filename}.fragment{fragmentIndex++}";
  23. using (FileStream output = new FileStream(outputFileName, FileMode.Create, FileAccess.Write))
  24. {
  25. output.Write(buffer, 0, bytesRead);
  26. }
  27. }
  28. // 计算整个文件的 SHA-256 哈希值并写入 .sha 文件
  29. using (SHA256 sha256Hash = SHA256.Create())
  30. {
  31. input.Seek(0, SeekOrigin.Begin);
  32. byte[] hashValue = sha256Hash.ComputeHash(input);
  33. string shaFileName = $"{filename}.sha";
  34. using (StreamWriter writer = new StreamWriter(shaFileName, false))
  35. {
  36. writer.Write(BitConverter.ToString(hashValue).Replace("-", ""));
  37. }
  38. }
  39. }
  40. }
  41. // Resume the file from fregments. Thanks for the code in TorchSharp!
  42. static void Restitch(string RestitcherPackage)
  43. {
  44. // !!!!!!!------------------------------NOTE------------------------------------!!!!!!
  45. // !!!!!!! This code is manually copied into pkg\common\RestitchPackage.targets !!!!!!
  46. // !!!!!!!------------------------------NOTE------------------------------------!!!!!!
  47. //
  48. // vvvvvvvvvvvvvvvvvvvvvvvvvvvvv START HERE vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  49. try
  50. {
  51. if (Directory.Exists(RestitcherPackage))
  52. {
  53. using (var writer = File.CreateText("obj/tensorflow_redist_build_log.txt"))
  54. {
  55. foreach (var p in Directory.EnumerateFiles(RestitcherPackage, "*", SearchOption.AllDirectories))
  56. {
  57. var primaryFile = Path.GetFullPath(p);
  58. writer.WriteLine("Found primary file at {0}", primaryFile);
  59. // See if there are fragments in the parallel nuget packages. If the primary is
  60. // some-package-primary\runtimes\....\a.so
  61. // some-package-primary\runtimes\....\a.so.sha
  62. // then the expected fragments are
  63. // some-package-fragment1\fragments\....\a.so
  64. // some-package-fragment2\fragments\....\a.so
  65. // some-package-fragment3\fragments\....\a.so
  66. // some-package-fragment4\fragments\....\a.so
  67. // some-package-fragment5\fragments\....\a.so
  68. // some-package-fragment6\fragments\....\a.so
  69. // some-package-fragment7\fragments\....\a.so
  70. // some-package-fragment8\fragments\....\a.so
  71. // some-package-fragment9\fragments\....\a.so
  72. // some-package-fragment10\fragments\....\a.so
  73. var shaFile = primaryFile + ".sha";
  74. var fragmentFile1 = primaryFile.Replace("-primary", "-fragment1").Replace("runtimes", "fragments") + ".fragment1";
  75. var fragmentFile2 = primaryFile.Replace("-primary", "-fragment2").Replace("runtimes", "fragments") + ".fragment2";
  76. var fragmentFile3 = primaryFile.Replace("-primary", "-fragment3").Replace("runtimes", "fragments") + ".fragment3";
  77. var fragmentFile4 = primaryFile.Replace("-primary", "-fragment4").Replace("runtimes", "fragments") + ".fragment4";
  78. var fragmentFile5 = primaryFile.Replace("-primary", "-fragment5").Replace("runtimes", "fragments") + ".fragment5";
  79. if (File.Exists(fragmentFile1)) writer.WriteLine("Found fragment file at {0}", fragmentFile1);
  80. if (File.Exists(fragmentFile2)) writer.WriteLine("Found fragment file at {0}", fragmentFile2);
  81. if (File.Exists(fragmentFile3)) writer.WriteLine("Found fragment file at {0}", fragmentFile3);
  82. if (File.Exists(fragmentFile4)) writer.WriteLine("Found fragment file at {0}", fragmentFile4);
  83. if (File.Exists(fragmentFile5)) writer.WriteLine("Found fragment file at {0}", fragmentFile5);
  84. if (File.Exists(fragmentFile1))
  85. {
  86. var tmpFile = Path.GetTempFileName();
  87. {
  88. writer.WriteLine("Writing restored primary file at {0}", tmpFile);
  89. using (var os = File.OpenWrite(tmpFile))
  90. {
  91. //writer.WriteLine("Writing bytes from {0} to {1}", primaryFile, tmpFile);
  92. //var primaryBytes = File.ReadAllBytes(primaryFile);
  93. //os.Write(primaryBytes, 0, primaryBytes.Length);
  94. if (File.Exists(fragmentFile1))
  95. {
  96. writer.WriteLine("Writing fragment bytes from {0} to {1}", fragmentFile1, tmpFile);
  97. var fragmentBytes1 = File.ReadAllBytes(fragmentFile1);
  98. os.Write(fragmentBytes1, 0, fragmentBytes1.Length);
  99. }
  100. if (File.Exists(fragmentFile2))
  101. {
  102. writer.WriteLine("Writing fragment bytes from {0} to {1}", fragmentFile2, tmpFile);
  103. var fragmentBytes2 = File.ReadAllBytes(fragmentFile2);
  104. os.Write(fragmentBytes2, 0, fragmentBytes2.Length);
  105. }
  106. if (File.Exists(fragmentFile3))
  107. {
  108. writer.WriteLine("Writing fragment bytes from {0} to {1}", fragmentFile3, tmpFile);
  109. var fragmentBytes3 = File.ReadAllBytes(fragmentFile3);
  110. os.Write(fragmentBytes3, 0, fragmentBytes3.Length);
  111. }
  112. if (File.Exists(fragmentFile4))
  113. {
  114. writer.WriteLine("Writing fragment bytes from {0} to {1}", fragmentFile4, tmpFile);
  115. var fragmentBytes4 = File.ReadAllBytes(fragmentFile4);
  116. os.Write(fragmentBytes4, 0, fragmentBytes4.Length);
  117. }
  118. if (File.Exists(fragmentFile5))
  119. {
  120. writer.WriteLine("Writing fragment bytes from {0} to {1}", fragmentFile5, tmpFile);
  121. var fragmentBytes5 = File.ReadAllBytes(fragmentFile5);
  122. os.Write(fragmentBytes5, 0, fragmentBytes5.Length);
  123. }
  124. }
  125. }
  126. var shaExpected = File.Exists(shaFile) ? File.ReadAllText(shaFile).ToUpper() : "";
  127. writer.WriteLine($"real sha: {shaExpected}");
  128. using (var sha256Hash = System.Security.Cryptography.SHA256.Create())
  129. {
  130. using (var os2 = File.OpenRead(tmpFile))
  131. {
  132. byte[] bytes = sha256Hash.ComputeHash(os2);
  133. var builder = new System.Text.StringBuilder();
  134. for (int i = 0; i < bytes.Length; i++)
  135. {
  136. builder.Append(bytes[i].ToString("x2"));
  137. }
  138. var shaReconstituted = builder.ToString().ToUpper();
  139. if (shaExpected != shaReconstituted)
  140. {
  141. string msg =
  142. $"Error downloading and reviving packages. Reconsituted file contents have incorrect SHA\n\tExpected SHA: ${shaExpected}\n\tActual SHA: ${shaReconstituted}\n\tFile was reconstituted from:"
  143. + $"\n\t{primaryFile} (length ${new FileInfo(primaryFile).Length})"
  144. + (File.Exists(fragmentFile1) ? $"\n\t{fragmentFile1} (length ${new FileInfo(fragmentFile1).Length})" : "")
  145. + (File.Exists(fragmentFile2) ? $"\n\t{fragmentFile2} (length ${new FileInfo(fragmentFile2).Length})" : "")
  146. + (File.Exists(fragmentFile3) ? $"\n\t{fragmentFile3} (length ${new FileInfo(fragmentFile3).Length})" : "")
  147. + (File.Exists(fragmentFile4) ? $"\n\t{fragmentFile4} (length ${new FileInfo(fragmentFile4).Length})" : "")
  148. + (File.Exists(fragmentFile5) ? $"\n\t{fragmentFile5} (length ${new FileInfo(fragmentFile5).Length})" : "");
  149. writer.WriteLine(msg);
  150. throw new Exception(msg);
  151. }
  152. }
  153. }
  154. writer.WriteLine("Deleting {0}", primaryFile);
  155. File.Delete(primaryFile);
  156. if (File.Exists(primaryFile))
  157. throw new Exception("wtf?");
  158. writer.WriteLine("Moving {0} --> {1}", tmpFile, primaryFile);
  159. File.Move(tmpFile, primaryFile);
  160. writer.WriteLine("Deleting {0}", fragmentFile1);
  161. File.Delete(fragmentFile1); // free up space and prevent us doing this again
  162. writer.WriteLine("Deleting {0}", fragmentFile2);
  163. if (File.Exists(fragmentFile2))
  164. File.Delete(fragmentFile2); // free up space and prevent us doing this again
  165. writer.WriteLine("Deleting {0}", fragmentFile3);
  166. if (File.Exists(fragmentFile3))
  167. File.Delete(fragmentFile3); // free up space and prevent us doing this again
  168. writer.WriteLine("Deleting {0}", fragmentFile4);
  169. if (File.Exists(fragmentFile4))
  170. File.Delete(fragmentFile4); // free up space and prevent us doing this again
  171. writer.WriteLine("Deleting {0}", fragmentFile5);
  172. if (File.Exists(fragmentFile5))
  173. File.Delete(fragmentFile5); // free up space and prevent us doing this again
  174. }
  175. }
  176. }
  177. }
  178. }
  179. catch (Exception ex)
  180. {
  181. Console.Error.WriteLine(ex.ToString());
  182. Console.Error.WriteLine(ex.StackTrace);
  183. }
  184. // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ END HERE^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  185. }