110,545
社区成员
发帖
与我相关
我的任务
分享
struct CFileInfor
{
public string fileName;
public long fileLength;
}
long GetFileSize(string fileName)
{
FileInfo fi = new FileInfo(fileName);
if (fi != null && fi.Exists == true)
{
return fi.Length;
}
return -1;
}
byte[] GetFileBytes(string fileName)
{
byte[] bytes = null;
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
bytes = new byte[fs.Length];
br.Read(bytes, 0, (int)fs.Length);
br.Close();
fs.Close();
}
catch
{ }
return bytes;
}
void CombineOneFile(string[] inFiles, string outFile)
{
FileStream fs = new FileStream(outFile, FileMode.CreateNew, FileAccess.Write);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(inFiles.Length);
foreach (string inFile in inFiles)
{
string fileName = Path.GetFileName(inFile);
long fileSize = GetFileSize(inFile);
bw.Write(inFile);
bw.Write(fileSize);
}
foreach (string inFile in inFiles)
{
byte[] bytes = GetFileBytes(inFile);
bw.Write(bytes);
}
bw.Close();
fs.Close();
}
void SplitFromOneFile(string oneFile, string outPath)
{
if (Directory.Exists(outPath) == false)
{
Directory.CreateDirectory(outPath);
}
FileStream fs = new FileStream(oneFile, FileMode.Open, FileAccess.Read);
int count = 0;
BinaryReader br = new BinaryReader(fs);
count = br.ReadInt32();
CFileInfor[] files = new CFileInfor[count];
for (int i = 1; i <= count; i++)
{
files[i - 1] = new CFileInfor();
files[i - 1].fileName = br.ReadString();
files[i - 1].fileLength = br.ReadInt64();
}
foreach (CFileInfor file in files)
{
byte[] bytes = null;
bytes = br.ReadBytes((int)file.fileLength);
FileStream fsTemp = new FileStream(outPath + "\\" + file.fileName, FileMode.Create, FileAccess.Write);
fsTemp.Write(bytes, 0, bytes.Length);
fsTemp.Close();
}
br.Close();
fs.Close();
}
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();
}
}
private void hebin()
{
int data=0;
FileStream targefile = new FileStream("a.txt", FileMode.Append , FileAccess.Write);
FileStream newfile = new FileStream("b.txt", FileMode.OpenOrCreate, FileAccess.Read);
byte [] buffer=new byte [newfile .Length ];
while ((data= newfile .Read (buffer ,0,(int)newfile .Length ))>0)
{
targefile .Write (buffer ,0,(int )newfile .Length );
}
newfile .Close ();
targefile .Close ();
}