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解决了眼前的问题-