C# 如何将多个文件打包成一个单一文件?

例如我有50张32*32的jpg文件且每个文件的文件名是无序的。C#有什么办法可以将这50张图片打包成一个单一文件,能通过文件原名字读取或者使用其他方式读取指定文件。且能... 例如我有 50张32*32的jpg文件 且每个文件的文件名是无序的。
C#
有什么办法可以将这50张图片打包成一个单一文件,
能通过文件原名字读取或者使用其他方式读取指定文件。
且能后期进行 增加、替换、删除操作。

请提供一个思路或者一段类似的源码。先谢谢咯!
展开
 我来答
makosharp
推荐于2017-11-26 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:269万
展开全部

方法倒是有很多种,不过直接利用资源管理器无疑是最快捷的。

我说的并不是解决方案的资源体系,而是System.Resource.ResourceReader和Writer,虽然不像ResourceManager一样有丰富的支持,但是仅靠枚举接口也足够你使用了。

我抽了点空直接给你写了个辅助静态类(ResPacker),注释齐全已调试,拿走用吧^_^


using System;
using System.Collections;
using System.Collections.Generic;
using System.Resources;
using System.IO;
using System.Drawing;
namespace ConsoleApplication3
{
    class Program
    {
        //写在前面:
        //1.这个辅助类可以帮你把任意多的任意对象都塞到一个文件里去,也能一次性的提出来
        //2.赶时间,一句try.catch都没写,自己补上
        //3.不建议将不同类型的对象打包到一个文件里。用Image就都Image,用string就都string,免得取出来后还要判断类型
        //4.增加和删除我没有写,原因是打包的资源文件本质是连续的字节流,从中间删一个文件太麻烦
        //5.增加操作可以使用非覆盖模式的打包方法强制追加(后面有说明)
        //6.删除操作建议读取所有的资源,删掉不要的然后一次性覆盖写入
        //7.再次提醒,.NET是决不允许资源名重名或者是数字首字资源名的。数字首字问题我已处理,重名问题自己看着办,最好穿进去前就丢到字典当主键
        //8.我未做文件占用检测,所以请避免一边打包一边解包。
        //9.此为静态类,给客户用的增删改小工具程序请把此类复制走
        //999.感谢您的围观!代码随便用!有麻烦还找我!
        static void Main(string[] args)
        {
            //打包
            Dictionary<string, object> dicToPack = new Dictionary<string, object>();
            dicToPack.Add("key1", Image.FromFile(@"c:\Users\Mako\Pictures\1.jpg"));
            dicToPack.Add("key2", "hello world");
            ResPacker.Pack(dicToPack);
            //解包
            Dictionary<string,object> dicRcv= ResPacker.GetAllResources();
            Console.WriteLine((string)dicRcv["key2"]);
            Console.WriteLine(dicRcv["key1"].GetType().FullName);
            Console.ReadKey();
        }
    }
    public static class ResPacker
    {
        /// <summary>
        /// 批量打包任意对象到资源文件
        /// </summary>
        /// <param name="objCollection">被打包对象的列表。键值对中键为其在资源文件中的唯一标示名。</param>
        /// <param name="targetFilePath">目标资源文件。默认参数为当前目录下的"MyRes.pck"文件。</param>
        /// <param name="overwrite">是否覆盖已存在的目标文件。默认=True</param>
        public static void Pack(IDictionary<string,object> objCollection, string targetFilePath = "MyRes.pck", bool overwrite = true)
        {
            if (overwrite)
                File.Delete(targetFilePath);
            using (ResourceWriter rw = new ResourceWriter(targetFilePath))
            {
                foreach (KeyValuePair<string, object> pair in objCollection)
                    //为了防传进来的资源名有数字开头,资源名都加了前缀_
                    rw.AddResource("_" + pair.Key, pair.Value);
                rw.Generate();
                rw.Close();
            }
        }
        /// <summary>
        /// 解包资源文件,返回所有资源及其资源名
        /// </summary>
        /// <param name="targetFilePath">要解包的资源文件。默认为当前目录下的"MyRes.pck"</param>
        /// <returns>资源字典,键值为资源唯一标示名。若无资源返回空集合。</returns>
        public static Dictionary<string,object> GetAllResources(string targetFilePath = "MyRes.pck")
        {
            Dictionary<string, object> rtn = new Dictionary<string, object>();
            using (ResourceReader rr = new ResourceReader(targetFilePath))
            {
                foreach (DictionaryEntry entry in rr)
                    rtn.Add(((string)entry.Key).Substring(1), entry.Value);
            }
            return rtn;
        }
        /// <summary>
        /// 根据资源名在指定的资源文件中检索资源
        /// </summary>
        /// <param name="resName">资源名</param>
        /// <param name="targetFilePath">要在其中检索的资源文件名,默认为"MyRes.pck"</param>
        /// <returns>资源名对应的资源</returns>
        public static object SearchResource(string resName,string targetFilePath="MyRes.pck")
        {
            object rtn=null;
            using (ResourceReader rr = new ResourceReader(targetFilePath))
            {
                foreach(DictionaryEntry entry in rr)
                    if ((string)entry.Key == '_' + resName)
                    {
                        rtn = entry.Value;
                        break;
                    }
            }
            return rtn;
        }
    }
}

 


补一句,如果要混传不同类型的对象,取出来不知道是什么类型请用GetType看一下;

使用上面三个方法时不用顾忌下划线问题,写入和读取时都已做处理;

资源名限制比较松,图像文件可以直接用其文件完整路径当资源名。

糖糖寳寳
2015-09-09 · TA获得超过6.4万个赞
知道大有可为答主
回答量:1.8万
采纳率:92%
帮助的人:3950万
展开全部

1、新建-->其他项目-->安装于部署
根据要求将文件都包含在setup工程项目里

2、或者将Debug换成Release运行一下
在bin/Release文件夹里就有想要的exe文件了.

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
livershi
2014-03-24 · TA获得超过165个赞
知道小有建树答主
回答量:208
采纳率:0%
帮助的人:210万
展开全部
使用c#程序资源文件(文件属性->生成操作:Resource),这样在做程序时是一个个文件但在发布程序时没有JPG文件,完全符合您的要求.
更多追问追答
追问
程序编译后发给了客户,客户怎么给这个文件新增,修改,删除其中的资源呢?
追答
你让客户去改啊?那为什么要打包成一个文件啊,不论怎么客户都不方便更改.可以把图片放到统一目录写配置程序让客户去进行 增加、替换、删除操作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
厹中也k
2014-03-24 · TA获得超过1999个赞
知道小有建树答主
回答量:338
采纳率:0%
帮助的人:161万
展开全部
可以参考一下:Ionic.Zip
更多追问追答
追问
这是什么?
追答
这个就是可以把多个文件打包成一个单一文件的东东。用途很广泛。可以了解一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式