当前位置:首页 > .NET其他

尝试做自己的万博官网用户登录 - (3) 打包文件

发表于 2017-05-21 12:14

万博官网用户登录最基本的功能就是打包文件和解压文件。实现思路如下:

.NET提供了资源文件.resx文件,里面可以存放各种格式的数据:字符串、图片、二进制等。最重要的是此资源文件可以在编译时嵌入到Exe中,Exe运行时可以从此资源文件中读取所需内容。我们将利用此特性将所需的文件打包到万博官网用户登录中,安装时再进行解压。为了统一,本万博官网用户登录将所有的文件都统一使用二进制保存入资源文件中。


打包代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Resources;

namespace ResourcePacker
{
    static class Program
    {
        public const string SOURCE_FOLDER = "Source";
        public const string FILELIST_RESFILE = "FileList.resx";
        public const string NODE_FILENAMES = "^FileNames^";

        /// 
        /// 应用程序的主入口点。
        /// 
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            string currentDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            string sourceDirectory = System.IO.Path.Combine(currentDirectory,SOURCE_FOLDER);
            string fileListPath = System.IO.Path.Combine(currentDirectory, FILELIST_RESFILE);

            if (!System.IO.Directory.Exists(sourceDirectory))
            {
                return;
            }

            string[] files = System.IO.Directory.GetFiles(sourceDirectory, "*", System.IO.SearchOption.AllDirectories);

            if (files.Length == 0)
            {
                return;
            }

            ResXResourceWriter resWriter = new ResXResourceWriter(fileListPath);
            string file = "";
            string fileName = "";
            string fileNames = "";

            try
            {
                for (int i = 0; i < files.Length; i++)
                {
                    file = files[i];
                    fileName = System.IO.Path.GetFileName(file);

                    resWriter.AddResource(fileName, System.IO.File.ReadAllBytes(file));

                    fileNames += (fileNames.Length > 0 ? (";" + Environment.NewLine) : "") + fileName;
                }

                resWriter.AddResource(NODE_FILENAMES, fileNames);
            }
            catch (Exception e)
            {
                Console.Write(e.ToString());
            }
            finally
            {
                resWriter.Generate();
                resWriter.Close();
            }

        }
    }
}

此代码如何工作:

  1. 新建项目

    使用VS新建一个Windows应用程序类型的项目,项目名为ResourcePacker。然后将此代码放入Program.cs文件中。

  2. 定义源文件路径

    在项目的生成输出路径下新建文件夹Source,将需要打包的文件存放在Source文件夹下。

  3. 生成项目

    生成项目,运行ResourcePacker.exe即可将Source中的文件打包到FileList.resx资源文件中。


至此,打包工作已经完成,下篇文章将讲解如何从资源文件中提取文件。



本文章由创风网原创,转载请注明出处:http://www.windite.com/article/details/vea5ry14