手机版

合并文件的具体方法 Net

时间:2021-11-17 来源:互联网 编辑:宝哥软件园 浏览:

上面列表中的文件不是来自一个文件夹中的所有jpg文件,而是来自

这个文件。将多个文件合并成一个文件在许多应用领域都非常有用。亲自实施这样的计划不仅令人愉快,而且在许多情况下还能帮助我们构建更高效的计划。在这里我做了一个案例与大家分享。由于合并后的文件就像一个包,这个文件的主要思想在下面被称为“包文件”:要将多个文件合并成一个包文件,需要区分其中一个文件并将其提取出来。我们需要知道文件的名称以及这个文件在包文件中的位置和长度,这叫做地址偏移量。因为包文件通常很大,所以它的内容不应该驻留在内存中,而应该只在需要某个部分时从包文件中提取。我做到了:

一个管理器类,它提供一些外围方法_pathList来存储要添加到包文件中的文件路径,通过调用AddSourceFile()方法将_pf添加为特定的包文件,通过LoadPackFile()生成一个实例,并通过CurrentPackFile属性返回Build方法来生成包文件

作为PackFile管理器的嵌套类,pack file类提供了包文件的属性和构造细节。好了,我们来看看PackFileManager复制的代码。Build()方法如下: public void build(字符串路径){使用(filestream fs=new filestream(路径,filemode。创建,文件访问。write)){ Binarywriter bw=new Binarywriter(fs);bw。写(' PackFile ');bw。写(这个。_路径列表。计数);foreach(此处为字符串f。_ PathList){ FileInfo fi=new FileInfo(f);bw。写(fi。长度);fi=null} foreach(此处为字符串f。_pathList) { bw。写(路径。GetFileName(f));} foreach(此处为字符串f。_pathList) { bw。写入(文件。readall bytes(f));bw。flush();}}} 1.首先向文件头2写入一个“PackFile”字符串。将要输出的Int32类型的文件数写入包文件3。将每个要输出的长类型文件的长度写入包文件。4.再次写入每个文件名。5.最后写出每个文件的实体内容。我觉得这样组织文件结构效率更高,因为我在写或者读的时候不会频繁的在Write方法或者ReadXXX方法的不同版本之间切换。问题来了。当写文件名时,我们使用bw。写(路径。GetFileName(f));当BinaryWriter。调用Write(字符串值)并传入一个字符串BinaryReader。读取时应调用ReadString()。这时,它如何区分两个字符串之间的边界?幸运的是,Write方法将首先把字符串长度写成一个四字节的无符号整数,所以当BinaryReader。使用ReadString()时,它会根据这个值读取特定长度的值,并将其解释为字符串。这里列出了几个重要的方法:复制代码如下:LoadPackFile方法public void LoadPackFile(string path){ if(!文件。存在(路径)){引发新的FileNotFoundException(路径);} if (_pf!=null) { _pf。close();_ pf=null} FileStream fs=新的FileStream(路径,FileMode。打开,文件访问。阅读);binary reader br=new binary reader(fs);如果(br。ReadString()!=' packfile '){ thrownnewinvalidationntfileexception('此文件不是有效的包文件');}这个。_pf=新的PackFile(fs,br);}这时,我们在生成时编写的字符串‘PackFile’就有了明确的功能。复制PackFile的构造函数的代码如下:内部packfile (filestream srcfile,二进制阅读器br) {this。_ sourcefile=srcfile_ br=br这个。_fileCount=_br。readint 32();//获取的文件数(int I=1;i=_ fileCount我){这个。_fileLengthList。添加(_br。readint 64());} for(int I=1;i=_ fileCount我){这个。_shortNameList。添加(_br。ReadString());}这个。_contentStartPos=_sourceFile。位置;//设置实体文件{ PackFile }的总起始位置。GetBytes()复制代码如下: public byte[]GetBytes(int index){ long start pos=this。_ contentstartposfor(int I=0;一级指数;i ) { startPos=这个。_ FileLengLiST[I];} _sourceFile。位置=开始位置;//设置文件内容return _ br.readbytes的起始位置((int) _文件长度列表[index]);}这只是草稿。我们还可以添加压缩或嵌套文件夹(如ZIP文件)的功能。别忘了和我分享改进后的代码。

版权声明:合并文件的具体方法 Net是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。