1

我有一些需要处理的大文件,并且想向用户说明文件大小,因为处理可能需要很长时间。

我正在使用 David Heffernan 的函数(非常感谢 David)来获取尺寸,而且效果很好。

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:=StrToInt(slSize[j])) 时,我收到一个错误,“xxx 不是整数”或非常接近该错误的东西。

我想我应该使用带有文件名的记录数组:字符串;大小:Int64;等在记录中,而不是使用 StringLists。事后诸葛亮,现在需要重新编写才能使用记录数组。

我需要一种作弊者的方法来将非常大的 StringList 值转换回 Int64,以用于将超出正常 StrToInt( 导致错误的函数的少数文件。

有人愿意救我的培根吗?谢谢你。

4

1 回答 1

10

改为使用StrToInt64。(该链接指向当前文档,但该功能也存在于 Delphi 7 中,在SysUtils单元中。)

myInt64 := StrToInt64(slSize[j]);

更好的是,首先不要将它存储在字符串中。将其存储在 中Int64,并且仅在需要时将其转换为字符串(例如在标签中显示)。如果您打算将其用作数字,请将其存储为数字。

您始终可以创建一个仅包含 的小类,并将其与具有文件名的字符串一起Int64存储,并在需要大小时从 中读取。您甚至可以在需要时处理转换为字符串的小类中添加一个属性。TStringList.ObjectsObjects

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;
于 2013-07-10T01:39:54.783 回答