将Mxd文件压缩并上传到Geodatabase!
把Mxd文件压缩上传测试代码!

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO.Compression; 6 using System.IO; 7 using ESRI.ArcGIS.DataSourcesGDB; 8 using ESRI.ArcGIS.esriSystem; 9 using ESRI.ArcGIS.Geodatabase; 10 using ESRI.ArcGIS.Geometry; 11 namespace CompressMxd 12 { 13 class CompressMxdFile 14 { 15 public static IWorkspace OpenWorkspace(string mdbPath) 16 { 17 IWorkspaceFactory pwspfact=new AccessWorkspaceFactoryClass(); 18 IWorkspace pwsp = pwspfact.OpenFromFile(mdbPath, 0); 19 return pwsp; 20 } 21 public static bool ReadAndCompressMxdFile(string fileName, IWorkspace pwsp) 22 { 23 byte[] buffer = null; 24 try 25 { 26 using (System.IO.FileStream sourceStream = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) 27 { 28 buffer = new byte[sourceStream.Length]; 29 int checkCounter = sourceStream.Read(buffer, 0, buffer.Length); 30 byte[] compressBytes = Compress(buffer); 31 32 MemoryBlobStream blob = new MemoryBlobStream(); 33 ((IMemoryBlobStreamVariant)blob).ImportFromVariant(compressBytes as object);//将一个Byte[]对象作为参数传入 34 35 IFeatureWorkspace pFwsp = pwsp as IFeatureWorkspace; 36 ITable ptable = pFwsp.OpenTable("MxdCollection"); 37 IRow row = ptable.CreateRow(); 38 var idx = row.Fields.FindField("MxdFile"); 39 IField field = ptable.Fields.get_Field(idx); 40 if (field.CheckValue(blob)) 41 { 42 row.set_Value(idx, blob as object); 43 } 44 row.Store(); 45 } 46 } 47 catch (System.Exception ex) 48 { 49 return false; 50 } 51 52 return true; 53 } 54 public static bool DeCompressMxdFile(string fileName,IWorkspace pwsp) 55 { 56 57 IFeatureWorkspace pFwsp = pwsp as IFeatureWorkspace; 58 ITable ptable = pFwsp.OpenTable("MxdCollection"); 59 IRow row = ptable.GetRow(4); 60 var idx = row.Fields.FindField("MxdFile"); 61 object objtest = row.get_Value(idx); 62 63 IMemoryBlobStreamVariant pVar = objtest as IMemoryBlobStreamVariant; 64 object pobj = new object(); 65 pVar.ExportToVariant(out pobj); //转入Object对象 66 byte[] desbytes = Decompress((byte[])pobj); 67 using (System.IO.FileStream destinationStream = new System.IO.FileStream(fileName, FileMode.Create)) 68 { 69 destinationStream.Write(desbytes,0,desbytes.Length); 70 } 71 return true; 72 } 73 private static byte[] Compress(byte[] bytes) 74 { 75 using (MemoryStream ms = new MemoryStream()) 76 { 77 GZipStream Compress = new GZipStream(ms, CompressionMode.Compress); 78 79 Compress.Write(bytes, 0, bytes.Length); 80 81 Compress.Close(); 82 83 return ms.ToArray(); 84 85 } 86 } 87 88 private static byte[] Decompress(Byte[] bytes) 89 { 90 using (MemoryStream tempMs = new MemoryStream()) 91 { 92 using (MemoryStream ms = new MemoryStream(bytes)) 93 { 94 GZipStream Decompress = new GZipStream(ms, CompressionMode.Decompress); 95 96 Decompress.CopyTo(tempMs); 97 98 Decompress.Close(); 99 100 return tempMs.ToArray(); 101 } 102 } 103 } 104 } 105 }
这里的这个思路和代码完全可以将任何文件上传到Geodatabase中!当然文件大小是受限制的。这和Access有关和机器的位数有关,在Oracle中是否可以放开一些文件大小方面的限制?
对文件进行管理,通过Hash算法进行文件的版本控制!这个想法确实不错,不过具体要做成什么样子呢,我也不知道!
微软提供了Compress(Gzipstream类)和Security命名空间分别实现了LZ77和哈弗曼编码结合的压缩算法,实现了加密的算法,可以直接调用。
说实话不太喜欢拿来主义,用是很方便,但是真的不是自己做出来的,感觉理解方面还是有很多困难。不知道其内部机制到底是怎样的!!!
不知道如果Mxd文档调用的要素类是服务器中的,我的Mxd文档下载到任意客户端是否都能够显示图形要素!
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程