c#合并两个任意格式文件

zhongxingjun 2008-07-24 08:34:56
我想合并两个俩个任意格式的文件成一个二进制文件,然后可以把这个二进制文件还原成两个文件.大家给点思路.
...全文
1020 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinpengming11 2011-03-13
  • 打赏
  • 举报
回复
look look
a103606 2010-06-30
  • 打赏
  • 举报
回复
Oh,God........
anyanchao 2010-01-11
  • 打赏
  • 举报
回复
关注
zhongxingjun 2008-07-24
  • 打赏
  • 举报
回复
楼上的,我用了一个老外写的zip库,不支持中文,所以放弃了.微软自带的zip库又不太符合需求
vrhero 2008-07-24
  • 打赏
  • 举报
回复
为什么不用现成的压缩库...比如SharpZipLib...简单还能压缩...
GhostAdai 2008-07-24
  • 打赏
  • 举报
回复
自定义个文件头区分一下应该就可以了。
ViewStates 2008-07-24
  • 打赏
  • 举报
回复
MARK
falx2004 2008-07-24
  • 打赏
  • 举报
回复
mark
别删贴
ChargeForward 2008-07-24
  • 打赏
  • 举报
回复
mark!
virusswb 2008-07-24
  • 打赏
  • 举报
回复
合并不同类型的文件,然后拆分,需要定义文件的标志,才好合并,要不不知道如何拆分了,2楼的办法好像可行
downmoon 2008-07-24
  • 打赏
  • 举报
回复
http://www.0769pc.com.cn/edu/article/softexp/51/18884_3.htm
主要代码

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.IO ;
using System.Text ;
using System.Data.OleDb ;

public string sDirectoryName = '' ;
//定义一个全局变量,用以存放合并文件所在的目录

private void button2_Click ( object sender , System.EventArgs e )
{
 openFileDialog1.Title ='请选择要合并的第一个文件' ;
 System.Windows.Forms.DialogResult drTemp = openFileDialog1.ShowDialog ( ) ;
 if ( drTemp == DialogResult.OK && openFileDialog1.FileName != '' )
 {
  textBox1.Text = openFileDialog1.FileName ;
 }
 string[ ] path = openFileDialog1.FileName .Split ( @'\'.ToCharArray ( ) ) ;
 string sTemp = '' ;
 int i= 0 ;
 for ( i= 0 ; i < path.Length - 1 ; i++ )
 {
  sTemp = sTemp + path[ i ] + @'\' ;
 }
 button1.Enabled = true ;
 sDirectoryName= sTemp ;
 //获得文件所在目录
}

private void button1_Click ( object sender , System.EventArgs e )
{
 string[ ] arrFileNames = Directory.GetFiles ( sDirectoryName ) ;
 //获取存放分割后小文件所在目录所在的所有小文件
 int iSumFile = arrFileNames.Length ;
 progressBar1.Maximum = iSumFile ;
 FileStream AddStream = new FileStream ( textBox2.Text , FileMode.OpenOrCreate ) ;
 //以合并后的文件名称和打开方式来创建、初始化FileStream文件流
 BinaryWriter AddWriter = new BinaryWriter ( AddStream ) ;
 //以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件
 /*循环合并小文件,并生成合并文件 */
 for ( int i = 0 ; i < iSumFile ; i++ )
 {
  FileStream TempStream = new FileStream ( arrFileNames[ i ] , FileMode.Open ) ;
  //以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用
  BinaryReader TempReader = new BinaryReader ( TempStream ) ;
  //用FileStream文件流来初始化BinaryReader文件阅读器,也起读取分割文件作用
  AddWriter.Write ( TempReader.ReadBytes ( ( int ) TempStream.Length ) ) ;
  //读取分割文件中的数据,并生成合并后文件
  TempReader.Close ( ) ;
  //关闭BinaryReader文件阅读器
  TempStream.Close ( ) ;
  //关闭FileStream文件流
  progressBar1.Value = i + 1 ;
  //显示合并进程
 }
 AddWriter.Close ( ) ;
 //关闭BinaryWriter文件书写器
 AddStream.Close ( ) ;
 //关闭FileStream文件流
 MessageBox.Show ( '成功合并!' ) ;
 progressBar1.Value = 0 ;
}
qyulang 2008-07-24
  • 打赏
  • 举报
回复
这个应该有点强悍!
hongqi162 2008-07-24
  • 打赏
  • 举报
回复
自己定义一个文件头信息,比如在文件的起始几个字节用来存放两个文件的信息最主要的是存放文件的字节大小,你可以通过这个大小来拆分你的这个文件,基本上就是这样
gomoku 2008-07-24
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
Packer.Pack(@"c:\temp\all.dat", @"c:\temp\a.bat", @"c:\temp\a.jpg");
string[] resultFiles = Packer.Unpack( @"c:\temp\all.dat" );

MessageBox.Show( string.Join("\n", resultFiles), "files generated under the current directory");
}


public class Packer
{
class Header
{
public long length;
public string filename;

public void WriteTo( Stream fs )
{
byte[] len = BitConverter.GetBytes(length);
byte[] buf = new byte[256];

byte[] str = Encoding.Unicode.GetBytes(filename);
str.CopyTo(buf, 0);

fs.Write(len, 0, len.Length);
fs.Write(buf, 0, buf.Length);
}
public bool ReadFrom( Stream fs)
{
byte[] len = BitConverter.GetBytes(length);
byte[] buf = new byte[256];

if (len.Length != fs.Read(len, 0, len.Length)) return false;
if (buf.Length != fs.Read(buf, 0, buf.Length)) return false;

length = BitConverter.ToInt64(len, 0);
filename = Encoding.Unicode.GetString(buf).Trim(new char[] { '\0' });
return true;
}
}

public static void Pack(string resultFilename, params string[] filenames)
{
using (FileStream fout = new FileStream(resultFilename, FileMode.Create, FileAccess.Write))
{
for (int i = 0; i < filenames.Length; i++)
{
using (FileStream fin = new FileStream(filenames[i], FileMode.Open))
{
Header header = new Header();
header.length = fin.Length;
header.filename = Path.GetFileName(filenames[i]);
header.WriteTo(fout);

byte[] buf = new byte[header.length];
fin.Read(buf, 0, buf.Length);
fout.Write(buf, 0, buf.Length);
}
}
}
}

public static string[] Unpack(string filename)
{
List<string> unpackedFiles = new List<string>();

using (FileStream fin = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
Header header = new Header();
while (header.ReadFrom(fin))
{
unpackedFiles.Add(header.filename);
byte[] buf = new byte[header.length];
fin.Read(buf, 0, buf.Length);

using (FileStream fout = new FileStream(header.filename, FileMode.Create, FileAccess.Write))
{
fout.Write(buf, 0, buf.Length);
}
}
}
return unpackedFiles.ToArray();
}
}
jeason_jun 2008-07-24
  • 打赏
  • 举报
回复
关注

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧