D10DJkaimengwenshang/项目代码/wenshangkm/机台检验主程序可配置20201/机台检验主程序可配置2020/U_FileAutoUpdate.pas
DESKTOP-E401PHE\Administrator 74d01e92e1 ~
2025-09-27 14:24:10 +08:00

346 lines
10 KiB
ObjectPascal

unit U_FileAutoUpdate;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, ShlObj, cxShellCommon, cxControls,
cxContainer, cxShellTreeView, cxShellListView, StdCtrls, BtnEdit,
OleCtnrs, DB, ADODB,ZLib;
function ExportFtErpFile(mFileName:string;ADORead:TADOQuery):boolean;
function ExportFtErpFile10(mFileName:string;ADORead:TADOQuery):boolean;
procedure GetFileInfo(mFile:string;var mfileSize:integer;var CreationTime:tdatetime;var WriteTime:tdatetime);
function CovFileDate(Fd:_FileTime):TDateTime;
procedure UpdateFileTime(FileName:string; CreationTime, LastAccessTime, LastWriteTime:TDateTime);
implementation
uses
U_CompressionFun;
///////////////////////////////////////////////////////
//函数功能:从服务器下载文件;
///////////////////////////////////////////////////////
function ExportFtErpFile10(mFileName:string;ADORead:TADOQuery):boolean;
var
Stream : TMemoryStream;
ff:TADOBlobstream;
mfileSize:integer;
mCreationTime:TdateTime;
mWriteTime:TdateTime;
IsFileHas:boolean;
mChildPath:string;
mFilePath:string;
begin
try
result:=false;
mChildPath:='';
///////////////////////////////////////////////
//获取文件下载的子路径
with ADORead do
begin
close;
sql.Clear ;
sql.Add('select FilePath ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
Open;
if RecordCount>0 then
begin
// if not fieldByName('valid').AsBoolean then exit;
if trim(fieldByName('FilePath').AsString)<>'' then
mChildPath:=trim(fieldByName('FilePath').AsString)+'\';
end;
end;
//如果产品存在
mFilePath:= ExtractFilePath(Paramstr(0))+mChildPath;
IsFileHas:= FileExists(mFilePath+mFileName);
if IsFileHas then
begin
//////////////////////////
//获取文件信息
GetFileInfo(mFilePath+mFileName,mfileSize,mCreationTime,mWriteTime);
end;
//////////////////////////////////////////
//存在文件
if IsFileHas then
begin
with ADORead do
begin
close;
sql.Clear ;
sql.Add('select count(FileName) as cnt ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
// sql.Add('and fileEditDate>'''+formatDateTime('yyyy-MM-dd hh:mm',mWriteTime)+'''');
sql.Add(' and DATEDIFF(minute,'+ quotedStr(formatDateTime('yyyy-MM-dd hh:mm',mWriteTime))+',fileEditDate)>0');
Open;
//是否存在新的文件
if fieldByName('cnt').AsInteger>0 then
begin
close;
sql.Clear ;
sql.Add('select * ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
Open;
ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
end
else
begin
exit;
end;
if trim(fieldByName('FilePath').AsString)<>'' then
mChildPath:=trim(fieldByName('FilePath').AsString)+'\';
end;
end
//////////////////////////////////////
//不存在
else
begin
with ADORead do
begin
close;
sql.Clear ;
sql.Add('select * ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
Open;
if recordCount>0 then
begin
ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
end
else
begin
exit;
end;
if trim(fieldByName('FilePath').AsString)<>'' then
mChildPath:=trim(fieldByName('FilePath').AsString)+'\';
end;
end;
if ff<>nil then
begin
try
mfileName:=trim(ADORead.fieldByName('FileName').asString);
if not DirectoryExists(ExtractFileDir(mFilePath+mfileName)) then
ForceDirectories(ExtractFileDir(mFilePath+mfileName));
Stream:= TMemoryStream.Create ;
//OleContainer1.SaveToStream(Stream);
//ADOQuery1FileContent.SaveToFile('tmp'); //数据存入临时文件
//OleContainer1.LoadFromFile('tmp'); //从临时文件中读取OLE对象
ff.SaveToStream(Stream);
CompressionStream(Stream); //数据压缩
//OleContainer1.SaveToFile(ExtractFilePath(Paramstr(0))+mfielName)
Stream.SaveToFile(mFilePath+mfileName); //+'\tmpFile\'
//OleContainer1.SaveToFile('tmp');
finally
Stream.Free ;
ff.free;
end;
end;
UpdateFileTime(mFilePath+mfileName,ADORead.fieldByName('FileCreateDate').AsDateTime,ADORead.fieldByName('FileEditDate').AsDateTime,ADORead.fieldByName('FileEditDate').AsDateTime);
Result:=true;
except
application.MessageBox(pchar('读取文件'+mfileName+'失败!'),'提示信息',0);
end;
end;
///////////////////////////////////////////////////////
//函数功能:从服务器下载文件;
///////////////////////////////////////////////////////
function ExportFtErpFile(mFileName:string;ADORead:TADOQuery):boolean;
var
Stream : TMemoryStream;
ff:TADOBlobstream;
mfileSize:integer;
mCreationTime:TdateTime;
mWriteTime:TdateTime;
IsFileHas:boolean;
mChildPath:string;
mFilePath:string;
begin
try
result:=false;
mChildPath:='';
///////////////////////////////////////////////
//获取文件下载的子路径
with ADORead do
begin
close;
sql.Clear ;
sql.Add('select FilePath ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
Open;
if RecordCount>0 then
begin
// if not fieldByName('valid').AsBoolean then exit;
if trim(fieldByName('FilePath').AsString)<>'' then
mChildPath:=trim(fieldByName('FilePath').AsString)+'\';
end;
end;
//如果产品存在
mFilePath:= ExtractFilePath(Paramstr(0))+mChildPath;
IsFileHas:= FileExists(mFilePath+mFileName);
if IsFileHas then
begin
//////////////////////////
//获取文件信息
GetFileInfo(mFilePath+mFileName,mfileSize,mCreationTime,mWriteTime);
end;
//////////////////////////////////////////
//存在文件
if IsFileHas then
begin
with ADORead do
begin
close;
sql.Clear ;
sql.Add('select count(FileName) as cnt ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
// sql.Add('and fileEditDate>'''+formatDateTime('yyyy-MM-dd hh:mm',mWriteTime)+'''');
sql.Add(' and DATEDIFF(minute,'+ quotedStr(formatDateTime('yyyy-MM-dd hh:mm',mWriteTime))+',fileEditDate)>0');
Open;
//是否存在新的文件
if fieldByName('cnt').AsInteger>0 then
begin
close;
sql.Clear ;
sql.Add('select * ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
Open;
ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
end
else
begin
exit;
end;
if trim(fieldByName('FilePath').AsString)<>'' then
mChildPath:=trim(fieldByName('FilePath').AsString)+'\';
end;
end
//////////////////////////////////////
//不存在
else
begin
with ADORead do
begin
close;
sql.Clear ;
sql.Add('select * ');
sql.Add('from RT_FileUpdate');
sql.Add('where FileName='+quotedStr(mFileName));
Open;
if recordCount>0 then
begin
ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
end
else
begin
exit;
end;
if trim(fieldByName('FilePath').AsString)<>'' then
mChildPath:=trim(fieldByName('FilePath').AsString)+'\';
end;
end;
if ff<>nil then
begin
try
mfileName:=trim(ADORead.fieldByName('FileName').asString);
if not DirectoryExists(ExtractFileDir(mFilePath+mfileName)) then
ForceDirectories(ExtractFileDir(mFilePath+mfileName));
Stream:= TMemoryStream.Create ;
//OleContainer1.SaveToStream(Stream);
//ADOQuery1FileContent.SaveToFile('tmp'); //数据存入临时文件
//OleContainer1.LoadFromFile('tmp'); //从临时文件中读取OLE对象
ff.SaveToStream(Stream);
//OleContainer1.SaveToFile(ExtractFilePath(Paramstr(0))+mfielName)
Stream.SaveToFile(mFilePath+mfileName); //+'\tmpFile\'
//OleContainer1.SaveToFile('tmp');
finally
Stream.Free ;
ff.free;
end;
end;
UpdateFileTime(mFilePath+mfileName,ADORead.fieldByName('FileCreateDate').AsDateTime,ADORead.fieldByName('FileEditDate').AsDateTime,ADORead.fieldByName('FileEditDate').AsDateTime);
Result:=true;
except
application.MessageBox(pchar('读取文件'+mfileName+'失败!'),'提示信息',0);
end;
end;
////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////
procedure GetFileInfo(mFile:string;var mfileSize:integer;var CreationTime:tdatetime;var WriteTime:tdatetime);
var
vSearchRec: TSearchRec;
begin
FindFirst(mFile,faAnyFile,vSearchRec);
mfileSize:=vSearchRec.Size;
CreationTime:=CovFileDate(vSearchRec.FindData.ftCreationTime);//创建时间
//vSearchRec.FindData.ftLastAccessTime//访问时间
WriteTime:=CovFileDate(vSearchRec.FindData.ftLastWriteTime);//修改时间
FindClose(vSearchRec);
end;
///////////////////////////////////////////////
//
/////////////////////////////////////////////
function CovFileDate(Fd:_FileTime):TDateTime;
var
Tct:_SystemTime;
Temp:_FileTime;
begin
FileTimeToLocalFileTime(Fd,Temp);
FileTimeToSystemTime(Temp,Tct);
CovFileDate:=SystemTimeToDateTime(Tct);
end;
procedure UpdateFileTime(FileName:string; CreationTime, LastAccessTime, LastWriteTime:TDateTime);
var
FileHnd : Integer;
SysTime : TSystemTime;
tTzi: TTimezoneInformation;
FCreationTime, FLastAccessTime, FLastWriteTime: TFileTime;
begin
GetTimezoneInformation(tTzi) ;
CreationTime := CreationTime+Ttzi.Bias/1440;
DateTimeToSystemTime(CreationTime,SysTime);
SystemTimeToFileTime(SysTime,FCreationTime);
//LastAccessTime := LastAccessTime + Ttzi.Bias/1440;
//DateTimeToSystemTime(LastAccessTime,SysTime);
//SystemTimeToFileTime(SysTime,FLastAccessTime);
LastWriteTime := LastWriteTime + Ttzi.Bias/1440;
DateTimeToSystemTime(LastWriteTime,SysTime);
SystemTimeToFileTime(SysTime,FLastWriteTime);
try
FileHnd := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
SetFileTime(FileHnd, @FCreationTime, nil, @FLastWriteTime);
finally
FileClose(FileHnd);
end;
end;
end.