//文件大小偏移
int
filesizeOffset = 0x0002;
//数据区偏移
int
dataOffset = 0x000A;
//图像宽度偏移
int
widthOffset = 0x0012;
//图像高度偏移
int
heightOffset = 0x0016;
//位数偏移
int
bitOffset = 0x001C;
//是否压缩偏移
int
compressOffset = 0x001E;
//数据区大小偏移
int
datasizeOffset = 0x0022;
int
width = 0;
int
height = 0;
int
fileheadsize = 0;
int
dataseize = 0;
int
offset = 0;
//读取待切分文件
string
file =
"c:\\1.bmp"
;
FileInfo fi =
new
FileInfo(file);
FileStream fs = fi.OpenRead();
byte
[] buff =
new
byte
[4];
//数据区偏移量
fs.Seek(dataOffset, SeekOrigin.Begin);
int
nBytesRead = fs.Read(buff, 0, buff.Length);
fileheadsize = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"数据区偏移:"
+fileheadsize);
//宽度
fs.Seek(widthOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
width = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"宽度:"
+ width);
//高度
fs.Seek(heightOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
height = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"高度:"
+ height);
//位数
fs.Seek(bitOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
offset = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"位数:"
+offset);
//是否压缩
fs.Seek(compressOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
offset = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"压缩:"
+ offset);
//数据区大小
fs.Seek(datasizeOffset, SeekOrigin.Begin);
fs.Read(buff, 0, buff.Length);
dataseize = BitConverter.ToInt32(buff, 0);
Console.WriteLine(
"数据区大小:"
+ dataseize);
//读取图像下半部分,写入11.bmp
FileStream fs1 =
new
FileStream(
"c:\\11.bmp"
,FileMode.OpenOrCreate);
//复制文件头
fs.Seek(0,SeekOrigin.Begin);
byte
[] filehead =
new
byte
[fileheadsize];
fs.Read(filehead, 0, fileheadsize);
fs1.Write(filehead, 0, fileheadsize);
//复制数据
byte
[] data =
new
byte
[dataseize/2];
fs.Seek(fileheadsize, SeekOrigin.Begin);
fs.Read(data, 0, data.Length);
fs1.Write(data, 0, data.Length);
//修改高度,因为是水平切分,所以不需修改宽度
byte
[] b =
new
byte
[4];
b = BitConverter.GetBytes(height/2);
fs1.Seek(heightOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//修改数据区大小
b =
new
byte
[4];
b = BitConverter.GetBytes(dataseize/ 2);
fs1.Seek(datasizeOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//修改文件大小
b =
new
byte
[4];
b = BitConverter.GetBytes(fs1.Length);
fs1.Seek(filesizeOffset, SeekOrigin.Begin);
fs1.Write(b, 0, buff.Length);
//关闭对象
fs.Close();
fs1.Flush();
fs1.Close();
Console.Read();
读取大文件
private
void
ReadStreamFromFile()
{
string
filePath =
@"D:\abc.txt"
;
int
bufferSize = 1024000;
//每次读取的字节数
byte
[] buffer =
new
byte
[bufferSize];
System.IO.FileStream stream =
null
;
try
{
stream =
new
System.IO.FileStream(filePath, System.IO.FileMode.Open);
long
fileLength = stream.Length;
//文件流的长度
int
readCount = (
int
)Math.Ceiling((
double
)(bufferSize / fileLength));
//需要对文件读取的次数
int
tempCount = 0;
//当前已经读取的次数
do
{
stream.Read(buffer, tempCount * bufferSize, bufferSize);
//分readCount次读取这个文件流,每次从上次读取的结束位置开始读取bufferSize个字节
//这里加入接收和处理数据的逻辑
tempCount++
//
}
while
(tempCount < readCount);
}
catch
{
}
finally
{
if
(stream !=
null
)
stream.Dispose();
}
}
using (var reader = new StreamReader(responseStream, encoding))
{
//10k
var clen = 1024 * 10;
var read = new Char[clen];
var count = reader.Read(read, 0, clen);
while (count > 0)
{
var str = new string(read, 0, count);
rsb.Append(str);
count = reader.Read(read, 0, clen);
}
reader.Close();
reader.Dispose();
responseStream.Dispose();
responseStream.Close();
response.Close();
}
{
//10k
var clen = 1024 * 10;
var read = new Char[clen];
var count = reader.Read(read, 0, clen);
while (count > 0)
{
var str = new string(read, 0, count);
rsb.Append(str);
count = reader.Read(read, 0, clen);
}
reader.Close();
reader.Dispose();
responseStream.Dispose();
responseStream.Close();
response.Close();
}