346 lines
10 KiB
ObjectPascal
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.
|