(600分)如何获得正在运行数据库文件的大小 ( 积分: 300 )

  • 主题发起人 主题发起人 ldfnet
  • 开始时间 开始时间
L

ldfnet

Unregistered / Unconfirmed
GUEST, unregistred user!
1、FileStream := TFileStream.Create(FileName, fmShareDenyNone);
2、hFile := CreateFile(lpFn, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, 0);
3、if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
Result := SearchRec.Size
文件大小超过3G
以上方法不能支持正在运行的数据库,请高手测试后回答
 
参考Demo下的VListView例子。以下代码从里面摘录。

procedure TForm1.CheckShellItems(StartIndex, EndIndex: Integer);

function ValidFileTime(FileTime: TFileTime): Boolean;
begin
Result := (FileTime.dwLowDateTime <> 0) or (FileTime.dwHighDateTime <> 0);
end;

var
FileData: TWin32FindData;
FileInfo: TSHFileInfo;
SysTime: TSystemTime;
I: Integer;
LocalFileTime: TFILETIME;
begin
//Here all the data that wasn't initialized in PopulateIDList is
//filled in.
for I := StartIndex to EndIndex do
begin
if ShellItem(I)^.Empty then
with ShellItem(I)^ do
begin
FullID := ConcatPIDLs(FPIDL, ID);
ImageIndex := GetShellImage(FullID, ListView.ViewStyle = vsIcon, False);

//File Type
SHGetFileInfo(
PChar(FullID),
0,
FileInfo,
SizeOf(FileInfo),
SHGFI_TYPENAME or SHGFI_PIDL
);
TypeName := FileInfo.szTypeName;

//Get File info from Windows
FillChar(FileData, SizeOf(FileData), #0);
SHGetDataFromIDList(
FIShellFolder,
ID,
SHGDFIL_FINDDATA,
@FileData,
SizeOf(FileData)
);

//File Size, in KB
Size := (FileData.nFileSizeLow + 1023 ) div 1024;
if Size = 0 then Size := 1;

//Modified Date
FillChar(LocalFileTime, SizeOf(TFileTime), #0);
with FileData do
if ValidFileTime(ftLastWriteTime)
and FileTimeToLocalFileTime(ftLastWriteTime, LocalFileTime)
and FileTimeToSystemTime(LocalFileTime, SysTime) then
try
ModDate := DateTimeToStr(SystemTimeToDateTime(SysTime))
except
on EConvertError do ModDate := '';
end
else
ModDate := '';

//Attributes
Attributes := FileData.dwFileAttributes;

//Flag this record as complete.
Empty := False;
end;
end;
end;

手上没有超过2G的文件存在,不能测试。但我想只要系统可以用文件属性显示出来,那么就可以API来读取出来,并不是一定要加载到内存才可以设置的。
 
或许可以使用内存映射的方式,创建映射文件时,有个参数时设置偏移量的,可以读取2^64大小的文件。
 
谢谢大家的回答
 
先给分,我测试一下,再给
 
dinglj1760:能简化一下么?
 
数据库文件显示错误1kB
 
后退
顶部