您的位置:首页 > 其它

Visual Studio 2008项目打包问题——项目太大C盘空间不够怎么办?

2008-08-29 20:17 330 查看
很多人在项目打包过程中都会遇到这样一个问题,数据库或者某个文件太大(几百兆甚至几个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(size, FileMode.Open);
//以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例
BinaryReader SplitFileReader = new BinaryReader(SplitFileStream);
//以FileStream文件流来初始化BinaryReader文件阅读器
byte[] TempBytes;
//每次分割读取的最大数据
int iFileCount = (int)(SplitFileStream.Length / iFileSize);
//小文件总数
progressBar1.Maximum = iFileCount;
if (SplitFileStream.Length % iFileSize != 0) iFileCount++;
/* 循环将大文件分割成多个小文件 */
for (int i = 1; i <= iFileCount; i++)
{
string sTempFileName = dir + @"/DBPat2007A" + i.ToString() + ".zip"; //小文件名为DBPat2007Ai.zip
//确定小文件的文件名称
FileStream TempStream = new FileStream(sTempFileName, FileMode.OpenOrCreate);
//根据文件名称和文件打开模式来初始化FileStream文件流实例
BinaryWriter TempWriter = new BinaryWriter(TempStream);
//以FileStream实例来创建、初始化BinaryWriter书写器实例
TempBytes = SplitFileReader.ReadBytes(iFileSize);
//从大文件中读取指定大小数据
TempWriter.Write(TempBytes);
//把此数据写入小文件
TempWriter.Close();
//关闭书写器,形成小文件
TempStream.Close();
//关闭文件流
progressBar1.Value = i - 1;
}
SplitFileReader.Close();
//关闭大文件阅读器
SplitFileStream.Close();
MessageBox.Show("分割成功!");
progressBar1.Value = 0;
}

合并方法:

private void CombineZip(string DirName,string DBName)//合并成DBP2007A.zip
{

//合并DirName路径下的所有ZIP文件
string[] arrFileNames = Directory.GetFiles(DirName);
//获取存放当前目录的所有小文件
int iSumFile = arrFileNames.Length;

string[] arrZipNames = new string[10];//声明存放当前目录的所有ZIP格式的小文件
int r = 0;//记录ZIP格式的文件个数

for (int i = 0; i < iSumFile; i++)
{

string name = (arrFileNames[i].ToString()).ToLower();
int a = name.Length;
if (name.Substring(a - 3, 3) == "zip")//判断是否为ZIP格式
{
//MessageBox.Show(arrFileNames[i].ToString());
arrZipNames[r] = arrFileNames[i];
r++;
}

}

int ZipSumFile = r;//记录zip格式的文件数量

//MessageBox.Show(ZipSumFile.ToString());

//FileStream AddStream = new FileStream("DBPat2007A.zip", FileMode.OpenOrCreate);
FileStream AddStream = new FileStream(DirName+"//"+DBName, FileMode.OpenOrCreate);
//以合并后的文件名称和打开方式来创建、初始化FileStream文件流
BinaryWriter AddWriter = new BinaryWriter(AddStream);
//以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件
/*循环合并小文件,并生成合并文件 */
for (int i = 0; i < ZipSumFile; i++)
{
FileStream TempStream = new FileStream(arrZipNames[i], FileMode.Open);
//以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用
BinaryReader TempReader = new BinaryReader(TempStream);
//用FileStream文件流来初始化BinaryReader文件阅读器,也起读取分割文件作用
AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));
//读取分割文件中的数据,并生成合并后文件
TempReader.Close();
//关闭BinaryReader文件阅读器
TempStream.Close();
//关闭FileStream文件流

File.Delete(arrZipNames[i]);
//删除对应的小文件以减少存储空间
}
AddWriter.Close();
//关闭BinaryWriter文件书写器
AddStream.Close();
//关闭FileStream文件流

}

解压方法:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;

namespace WanFangData_DataImport
{
public class crelease
{
/*ZIP解压缩的方法*/
public void UnZip(string[] args)
{
ZipInputStream zis = new ZipInputStream(File.OpenRead(args[0]));

ZipEntry ze;
try
{
while ((ze = zis.GetNextEntry()) != null)
{
string sDirName = Path.GetDirectoryName(args[1]);
string sFileName = Path.GetFileName(ze.Name);

Directory.CreateDirectory(sDirName);
if (sFileName != String.Empty)
{
FileStream fs = File.Create(args[1] + ze.Name);

int nSize = 2048;
byte[] bData = new byte[2048];
while (true)
{
nSize = zis.Read(bData, 0, bData.Length);
if (nSize > 0)
{
fs.Write(bData, 0, nSize);
}
else
{
break;
}
}
fs.Close();
}
}

zis.Close();

}
//catch
catch (Exception ex)
{
return;
//MessageBox.Show(ex.ToString());
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐