Delphi文件大小恢复到Int64?
我有一些大文件需要处理,并希望向用户指示文件大小,因为处理可能需要很长时间 我正在使用大卫·赫弗南的函数,非常感谢大卫得到了这个尺寸,它工作得非常好Delphi文件大小恢复到Int64?,delphi,delphi-7,Delphi,Delphi 7,我有一些大文件需要处理,并希望向用户指示文件大小,因为处理可能需要很长时间 我正在使用大卫·赫弗南的函数,非常感谢大卫得到了这个尺寸,它工作得非常好 function GetFileSize3(const FileName: string): Int64; var fad: TWin32FileAttributeData; begin if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
function GetFileSize3(const FileName: string): Int64;
var
fad: TWin32FileAttributeData;
begin
if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
RaiseLastOSError;
Int64Rec(Result).Lo := fad.nFileSizeLow;
Int64Rec(Result).Hi := fad.nFileSizeHigh;
end;
然后,我将其转换为字符串,并将其和其他字符串存储在StringList中,以供以后使用
当我尝试将其转换回Int64值myInt64:=StrToIntslSize[j]时,我得到一个错误,xxx不是整数或与该错误非常接近的某个值
我想我应该使用一个文件名为String的记录数组;尺寸:Int64;等,而不是使用字符串列表。事后诸葛亮真是太好了,现在要使用一系列记录需要进行一次大规模的重写
我需要一种作弊的方法,将非常大的StringList值转换回Int64,用于少数文件,这些文件将超出导致错误的正常stroint函数
有人想救我吗?谢谢。改用。该链接指向当前文档,但该函数也存在于Delphi7的SysUtils单元中
更好的是,首先不要将其存储在字符串中。将其存储在Int64中,并且仅当您需要将其转换为字符串(例如用于显示在标签中)时才将其转换为字符串。如果您计划将其用作数字,请将其存储为数字
您始终可以创建一个只包含Int64的小类,并将其与具有文件名的字符串一起存储在TStringList.Objects中,并在需要大小时从对象中读取它。您甚至可以在这个小类中添加一个属性,以便在需要时处理到字符串的转换
type
TFileSizeInfo = class(TObject)
private
FFileSize: Int64;
function GetFileSizeAsString: string;
public
constructor Create(TheFileSize: Int64);
property AsInt64: Int64 read FFileSize write FFileSize;
property AsString: string read GetFileSizeAsString;
end;
implementation
constructor TFileSizeInfo.Create(TheFileSize: Int64);
begin
inherited Create;
FFileSize := TheFileSize;
end;
function TFileSizeInfo.GetFileSizeAsString: string;
begin
Result := IntToStr(FFileSize);
end;
使用它:
// Add to stringlist
var
FileSizeInfo: TFileSizeInfo;
begin
FileSizeInfo := TFileSizeInfo.Create(GetFileSize3(TheFleName);
slSize.AddObject(TheFileName, FileSizeInfo);
end;
// Reading it back
var
SizeAsInt64: Int64;
SizeAsString: string;
begin
SizeAsInt64 := TFileSizeInfo(slSize.Objects[Index]).AsInt64;
SizeAsString := TFileSizeInfo(slSize.Objects[Index]).AsString;
end;
// Clearing your `TStringList` and its `Objects`
procedure ClearFileList(TheList: TStringList);
var
i: Integer;
begin
for i := 0 to TheList.Count - 1 do
TheList.Objects[i].Free;
TheList.Clear;
end;
改用。该链接指向当前文档,但该函数也存在于Delphi7的SysUtils单元中
更好的是,首先不要将其存储在字符串中。将其存储在Int64中,并且仅当您需要将其转换为字符串(例如用于显示在标签中)时才将其转换为字符串。如果您计划将其用作数字,请将其存储为数字
您始终可以创建一个只包含Int64的小类,并将其与具有文件名的字符串一起存储在TStringList.Objects中,并在需要大小时从对象中读取它。您甚至可以在这个小类中添加一个属性,以便在需要时处理到字符串的转换
type
TFileSizeInfo = class(TObject)
private
FFileSize: Int64;
function GetFileSizeAsString: string;
public
constructor Create(TheFileSize: Int64);
property AsInt64: Int64 read FFileSize write FFileSize;
property AsString: string read GetFileSizeAsString;
end;
implementation
constructor TFileSizeInfo.Create(TheFileSize: Int64);
begin
inherited Create;
FFileSize := TheFileSize;
end;
function TFileSizeInfo.GetFileSizeAsString: string;
begin
Result := IntToStr(FFileSize);
end;
使用它:
// Add to stringlist
var
FileSizeInfo: TFileSizeInfo;
begin
FileSizeInfo := TFileSizeInfo.Create(GetFileSize3(TheFleName);
slSize.AddObject(TheFileName, FileSizeInfo);
end;
// Reading it back
var
SizeAsInt64: Int64;
SizeAsString: string;
begin
SizeAsInt64 := TFileSizeInfo(slSize.Objects[Index]).AsInt64;
SizeAsString := TFileSizeInfo(slSize.Objects[Index]).AsString;
end;
// Clearing your `TStringList` and its `Objects`
procedure ClearFileList(TheList: TStringList);
var
i: Integer;
begin
for i := 0 to TheList.Count - 1 do
TheList.Objects[i].Free;
TheList.Clear;
end;
@肯怀特,谢谢。后来将其用作字符串或整数是一个两难的选择,我选择了字符串,因为这两种形式都被广泛地重复使用。在最初的2005年,拥有多个字符串列表更方便。直到最近,客户才想将该系统用于2G+文件,但该系统出现了故障:@KenWhite,通过更多的测试,包括使用您的建议、SQL数据库、TLists、动态数组等,结果表明,使用多个StringList可以提供更快的处理速度,因为数组索引通常在35000范围内。使用StrToInt64解决了最初的问题。我必须先看看您的基准代码,然后才能相信多个35K字符串的字符串列表,每个字符串都比一个35K字符串和一个非常小的对象的字符串列表要快。不过,很高兴StrToInt64解决了眼前的问题-@肯怀特,谢谢。后来将其用作字符串或整数是一个两难的选择,我选择了字符串,因为这两种形式都被广泛地重复使用。在最初的2005年,拥有多个字符串列表更方便。直到最近,客户才想将该系统用于2G+文件,但该系统出现了故障:@KenWhite,通过更多的测试,包括使用您的建议、SQL数据库、TLists、动态数组等,结果表明,使用多个StringList可以提供更快的处理速度,因为数组索引通常在35000范围内。使用StrToInt64解决了最初的问题。我必须先看看您的基准代码,然后才能相信多个35K字符串的字符串列表,每个字符串都比一个35K字符串和一个非常小的对象的字符串列表要快。不过,很高兴StrToInt64解决了眼前的问题-