!!文件处理过程中的奇怪的问题,请一定进来看看,谢谢!!(100分)

  • 主题发起人 victornb
  • 开始时间
V

victornb

Unregistered / Unconfirmed
GUEST, unregistred user!
我要把一个自定义的记录和数据库中的jpg数据(blob字段)的信息写入一个文件,
但从文件中取出的数据分割后,原来对应的blob字段中的数据保存为.jpg后,文件大
小没错,就是不能显示原来的图片了,这是怎么回事??难道数据读入TMemoryStream
中后格式就变了吗??郁闷!![:(]
代码如下:
var
Type
Head=record
AllCount: Integer;
XP: String[1];
end;
SQLStr:String;
FileNO:TFileStream;
TempStream:TMemoryStream;
TempRecard:Head;

i:Integer;
begin
CreateFile;//创建文件
SQLStr := 'Select ZP from T_ZPB ';//zp为blob字段
OpenTempQuery(SQLStr);//打开数据库表
TempHead.TableName := 10;
TempHead.XP := 'Y';
FileNO:=tfilestream.create(FMain.P_FileName,fmOpenWrite);//打开文件
TempStream := TMemoryStream.Create;
try
TempRecard.AllCount:=1;
TempRecard.XP :='Y';
TBlobField(DM.Query_Temp.FieldByName('ZP')).SaveToStream(TempStream);

i := TempStream.Size;
if I = 0 then
ShowMessage('错误的数据!');

FileNO.seek(0,soFromEnd);
FileNO.write(TempRecard,sizeof(TempRecard));
FileNO.seek(0,soFromEnd);
FileNO.write(TempStream,TempStream.Size);
Finally
TempStream.Free;
FileNO.Free;
end;
end;
 
读出来后嘛,要先Seek(0, soFromBeginning);要不然给你加一大堆stream的head
 
我读出来了,前面的数据是正确的,就是图片的数据不对!
 
添加这一行试一试:
[red]TempStream.Position := 0;[/red]
FileNO.write(TempStream,TempStream.Size);
 
还是一样呀![:(]
 
读的代码:
var
m :TFileStream;
TempRecard:Head;
i:Integer;
begin
m := TFileStream.Create(FMain.P_FileName,fmOpenRead);

try
m.Read(TempRecard,Sizeof(Head));
m.Seek(Sizeof(recordHead)+Sizeof(H_XPB),0);
i := m.Read(TempStream,MyImage.Size);
//TempStream.CopyFrom(m,MyImage.Size);
TempStream.Position := 0;

if i=0 then
begin
ShowMessage('错误的数据!');
exit;
end;
TempStream.SaveToFile('test.jpg');
Edit1.Text := IntToStr(TempRecard.AllCount);
Edit2.Text := TempRecard.XP;
Finally
M.Free;
end;
 
大家说说看啊!
 
XP: String[1];

最好把 String[1] 换成 char
因为 String[1] 在流的读写中会涉及 string[0]
 
把记录去掉,只要用TFileStream将含有图片数据的TMemoryStream的存入文件
就有这样的问题

补充:
上面读的代码漏了一些定义和代码:
var
TempStream : TMemoryStream;
。。。。。
TempStream.Create;
。。。。。
TempStream.Free;
 
另外,读的时候 多了 Sizeof(H_XPB),
MyImage.Size 是怎么来的。
m.Seek(Sizeof(recordHead)+Sizeof(H_XPB),0);
i := m.Read(TempStream,MyImage.Size);
 
MyImage.Size 是正好=图片的大小;
另外m.Seek(Sizeof(recordHead)+Sizeof(H_XPB),0);应该是
m.Seek(Sizeof(recordHead),0);
本来我有两个定义的记录的。

但是是存入的时候就不对了呀?
 
关于使用TFileStream操作BMP图形文件
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream;
MemoryStream: TMemoryStream;
begin
try
FileStream := TFileStream.Create('E:/bmp2.',fmOpenReadWrite);
MemoryStream := TMemoryStream.Create;
MemoryStream.LoadFromFile('e:/bmp1.bmp');
MemoryStream.SaveToStream(FileStream);
ShowMessage('OK');
except
FileStream.Free;
MemoryStream.Free;
end;
end;
 
精简一下代码吧:
如下:
生成的三个文件大小一样,将xx002.dat和x003.dat改名为jpg扩展名,成功显示图片,
而xx001.dat不能显示,问题出在那?

var
FileNO:TFileStream;
TempStream:TMemoryStream;
begin
FileNO:=tfilestream.create(‘xx001.dat',fmOpenWrite);
TempStream := TMemoryStream.Create;
TBlobField(DM.Query_Temp.FieldByName('ZP')).SaveToFile('xx002.dat');
TBlobField(DM.Query_Temp.FieldByName('ZP')).SaveToStream(TempStream);
TempStream.SaveToFile('xx003.dat');
TempStream.Position := 0;
FileNO.write(TempStream,TempStream.Size);
Finally
TempStream.Free;
FileNO.Free;
end;
 
你上面给的代码根本不完整,我感觉到你比较混乱。

每次读写流时,对流的 position 和 size 进行监视。
看看这些属性是否正确。

先对你在头上加的 headrecord 测试一下,读出来是否正确,
然后要读入的文件流建立后看看长度是否正确。
头的长度+Image 的长度是否是流的总长度。
 
再精简点:
读入文件052.jpg,生成的两个文件大小一样,
将x003.dat改名为jpg扩展名,成功显示图片,
而xx001.dat不能显示,问题出在那?

var
FileNO:TFileStream;
TempStream:TMemoryStream;
begin
try
FileNO:=tfilestream.create('xx001.dat',fmOpenWrite);
TempStream := TMemoryStream.Create;
TempStream.LoadFromFile('052.jpg');
TempStream.SaveToFile('xx003.dat');
TempStream.Position := 0;
FileNO.write(TempStream,TempStream.Size);
Finally
TempStream.Free;
FileNO.Free;
end;
end;
 
估计你的 'xx001.dat' 不是空文件,你必须将它清空后再写入。
 
我已经清空了,字节是零的情况才执行的呀!
 
应该是第一个参数的问题,可能不能这么写,我在看。
FileNO.write(TempStream,TempStream.Size);
/////////
 
OK/!!!!!!!!!!!!!!!!1

procedure TForm1.Button1Click(Sender: TObject);
var
FileNO:TFileStream;
TempStream:TMemoryStream;
begin
try
FileNO:=tfilestream.create('d:/xx001.dat',fmCreate or fmOpenWrite);
TempStream := TMemoryStream.Create;
TempStream.LoadFromFile('d:/l010_small.jpg');
TempStream.SaveToFile('d:/xx003.dat');
TempStream.Position := 0;
////////要如下写
TempStream.SaveToStream(fileno);
///////
Finally
TempStream.Free;
FileNO.Free;
end;
end;
 
多人接受答案了。
 
顶部