Delphi 10.3中能否直接打开Firebird 2.5的Binary Blob?若不能,保存后如何删除?
Delphi 10.3 + Firebird 2.5 Binary Blob 文件操作问题
能否直接打开Blob中的各类文件(无需存盘)
大部分第三方桌面程序(如Word、Excel、PDF阅读器等)只能通过磁盘文件路径加载内容,无法直接读取内存中的Blob数据来打开文件。但有两类例外:
- 图片文件:Delphi自带的
TImage控件可直接加载Blob数据,无需存盘。通过TBlobStream读取Blob字段内容,再调用TImage.Picture.LoadFromStream即可显示。 - 纯文本文件:可将Blob中的文本内容直接读取到
TMemo或TRichEdit控件中显示、编辑,无需存盘。
对于Word、Excel、PDF这类需要外部程序打开的文件,必须先将Blob数据写入临时文件,再调用对应程序打开该文件。
保存临时文件后的删除处理
如果必须使用临时文件,可按以下流程操作,确保文件能被正常删除:
- 生成唯一临时文件:使用Delphi的
TPath.GetTempFileName函数在系统临时目录生成唯一文件,避免文件名冲突。 - 写入Blob数据到临时文件:通过
TBlobStream读取Firebird的Blob字段,将流内容写入临时文件。 - 等待外部程序关闭:调用外部程序打开文件时,需等待程序进程结束后再删除文件(否则会提示文件被占用)。可通过
CreateProcess配合WaitForSingleObject实现进程等待。 - 删除临时文件:进程结束后,调用
DeleteFile函数删除临时文件。若担心程序异常退出导致文件遗留,可在程序启动时清理系统临时目录下的历史临时文件。
示例代码片段
procedure OpenAndCleanBlobFile(const ABlobField: TBlobField); var TempFilePath: string; BlobStream: TBlobStream; LocalFileStream: TFileStream; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin // 生成系统临时文件 TempFilePath := TPath.GetTempFileName(TPath.GetTempPath); try // 读取Blob字段内容到临时文件 BlobStream := TBlobStream.Create(ABlobField, bmRead); try LocalFileStream := TFileStream.Create(TempFilePath, fmCreate or fmShareDenyWrite); try LocalFileStream.CopyFrom(BlobStream, BlobStream.Size); finally LocalFileStream.Free; end; finally BlobStream.Free; end; // 启动外部程序并等待进程结束 FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); if CreateProcess(nil, PChar('"' + TempFilePath + '"'), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo) then begin WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; finally // 无论成功失败,都删除临时文件 DeleteFile(TempFilePath); end; end;
内容的提问来源于stack exchange,提问作者KissGe
相关产品推荐
相关产品推荐

