【问题标题】:Delphi file size back to an Int64?Delphi文件大小回到Int64?
【发布时间】:2013-07-10 01:30:51
【问题描述】:

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

我正在使用 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 不是整数”或非常接近该错误的内容。

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

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

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

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    请改用StrToInt64。 (该链接指向当前文档,但该函数也存在于 Delphi 7 中,在 SysUtils 单元中。)

    myInt64 := StrToInt64(slSize[j]);
    

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

    您始终可以创建一个只包含Int64 的小类,并将其与具有文件名的字符串一起存储在TStringList.Objects 中,并在需要大小时从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;
    

    【讨论】:

    • @ken white 谢谢。稍后将其用作字符串或整数之间是一个折腾,我选择了字符串,因为两者都以任何一种形式广泛重复使用。最初(2005 年)拥有多个 StringList 更方便。直到最近,客户才想将系统用于 2G+ 文件,但它坏了。 :)
    • @KenWhite,通过更多测试,包括使用您的建议、SQL 数据库、TLists、动态数组等,事实证明,使用多个 StringList 总体上可以更快地处理,就像 Array-Indexes 一样在 35,000 范围内。使用“StrToInt64”是解决原始问题的方法。
    • 我必须先查看您的基准测试代码,然后才能相信每个包含 35K 字符串的多个字符串列表比包含 35K 字符串和一个非常小的对象的字符串列表要快,恐怕。不过,很高兴StrToInt64 解决了眼前的问题。 :-)
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多