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

来源:互联网 发布:查询视图的sql语句 编辑:程序博客网 时间:2024/06/11 06:21

  很多人在项目打包过程中都会遇到这样一个问题,数据库或者某个文件太大(几百兆甚至几个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());
            }
        }
    }
}

原创粉丝点击