很多人在项目打包过程中都会遇到这样一个问题,数据库或者某个文件太大(几百兆甚至几个G),打包时Visual Studio会提示C盘存储空间不够。通常情况下,我们会选择采用分区软件重新分配给C盘更多的空间,然而更多的情况是尽管你找了一个C盘拥有200G的剩余空间的电脑也无法完成一个包含800M数据库的项目部署,即便解决了空间问题,打包速度也是奇慢无比。这时,我们应该分析原因并找出解决方案。
下面是我最近刚解决的一个问题:
我们要对一个Winform项目打包,本来项目本身只有20M左右,可是因为它需要一个4G多的盘大数据库作支持。于是,我们将数据库(SQLExpress版本)分为三个库,分别部署在三个项目中,最后通过连接程序将这三个项目连接起来完成软件的安装。
可是数据库实在太大了,我们对三个数据库分别用7-zip软件极限压缩,最终最大的数据库大概剩下800M的样子,最小的也有300M。
我们尝试着用一个C盘空余两为80G的电脑对其打包,结果提示C盘存储空间不够;我们没有放弃,找来一台250G硬盘的电脑,采用分区软件合并成一个分区,再打包,一分钟后依然显示C盘存储空间不够。这就郁闷了,咋办呢?总不见得整来一台500G的电脑吧,再说能不能打起来还是问题呢。
我们想到既然是因为数据库(这时压缩后变成ZIP格式的了)太大,那么我们能不能将他们切割成几份打包,到时候写个程序在安装软件的时候再给它合并起来呢?
经过多次试验,证明了我们的想法。可是切割多大为好呢?同样经过多次试验,我们的数据库是800M,这时切割的文件每个100M是最佳的,因为我们必须考虑到它的合并速度(这将影响到软件的安装速度)。
这样一来,只需要将原来的800M的数据库分割成8份,打包就能够轻易完成(C盘剩余20G时打包也只需要20多分钟)!
由于数据库需要在软件安装的过程中自动附加,这时就需要将分割的文件合并起来再解压。我们采用了Split技术以及网络上的C#解压组件(ICSharpZipLib.DLL)。
下面是我的文件分割和合并代码:
分割方法:
private void split(int size,string dir)
{
int iFileSize = size * 1024*1024;
//根据选择来设定分割的小文件的大小
if (Directory.Exists(dir))
Directory.Delete(dir, true);
//如果计算机存在存放分割文件的目录,则全部删除此目录所有文件
else
Directory.CreateDirectory(dir);
//反之则在计算机创建目录
FileStream SplitFileStream = new FileStream(