узнать размер файла который больше 5 гигибай

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
alexmai
постоялец
Сообщения: 106
Зарегистрирован: 02.02.2009 13:58:42

узнать размер файла который больше 5 гигибай

Сообщение alexmai »

Народ чем можно работать с такими файлами
System.FileSize(F) вместо 5, 1 гига показывает 1.2 Гига
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

TFileStream
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

stikriz писал(а):TFileStream

Это еще зачем?

FileSize работает нормально и возвращает int64.
Я подозреваю, что файл был объявлен неправильно. См. пример ниже.

Код: Выделить всё

var f:file of byte;
begin
  AssignFile(f, 'bigfile.dat');
  reset(f);

  writeln( FileSize(f) );

  CloseFile(f);         
alexmai
постоялец
Сообщения: 106
Зарегистрирован: 02.02.2009 13:58:42

Сообщение alexmai »

Вот кусок кода, работающего прекрасно на размерах до 4 гиг
(freepascal 2.4.0, даже функцию FileSize(FF) вызываю через System, но
размер показывает не правильно )
Операционка winxp sp3,
причем на С функция ftell(ff) после seek(ff,0,2) вообще возвращает размер 0

Код: Выделить всё

var FF : file of byte;
S : longint;
begin
AssignFile(FF,Edit1.Text);
Reset(FF);
S := System.FileSize(FF);

при размере файла 5 434 731 549 байт показывает 1 139 764 253 байта
такое впечатление что что-то с операционкой

Добавлено спустя 32 минуты 42 секунды:
проверил на Мандриве 2010.2 тоже не правильный размер файла показывает
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Моя система:
Windows XP Sp3.
Lazarus SVN: 28824
Тобишь он использует FPC 2.4.2

Вот код:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
FF : file of byte;
S : int64;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(FF,OpenDialog1.FileName);
    Reset(FF);
    S := System.FileSize(FF);
    Caption:=IntToStr(S)+ ' Байт';
    Label1.Caption:='Имя Файла: '+ OpenDialog1.FileName;
  end;
end;


Для слабоверующих код всей формы:

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
FF : file of byte;
S : int64;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(FF,OpenDialog1.FileName);
    Reset(FF);
    S := System.FileSize(FF);
    Caption:=IntToStr(S)+ ' Байт';
    Label1.Caption:='Имя Файла: '+ OpenDialog1.FileName;
  end;
end;

end.


Для тех кому и этого мало вот скрины:
Скрин св-ва файла весом 34 Гига.. Мне показалось что 34 > 5 :)
Изображение

А вот уже скрин, программы, код которой приведен выше:
Изображение
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

alexmai писал(а):Вот кусок кода, работающего прекрасно на размерах до 4 гиг
(freepascal 2.4.0, даже функцию FileSize(FF) вызываю через System, но
размер показывает не правильно )


Тип longint размером 32 бит, а FileSize для больших файлов возвращает число, не влезающее в размер 32 бит. Я же не просто так предложил использовать тип int64.

Такие баги элементарно отслеживаются компилятором. Так что обращайте внимание на предупреждения и _не_ отключайте range/overflow checks.
alexmai
постоялец
Сообщения: 106
Зарегистрирован: 02.02.2009 13:58:42

Сообщение alexmai »

MageSlayer писал(а):
alexmai писал(а):Вот кусок кода, работающего прекрасно на размерах до 4 гиг
Тип longint размером 32 бит, а FileSize для больших файлов возвращает число, не влезающее в размер 32 бит. Я же не просто так предложил использовать тип int64.
Такие баги элементарно отслеживаются компилятором. Так что обращайте внимание на предупреждения и _не_ отключайте range/overflow checks.


Спасибо MageSlayer большое , хорошо что дал комментарий для слабоумным, закомплексованность состояла в том что я был уверен что 32 битного целого хватит, а проверить не хватило аккуратности.
Одно радует, что я еще не совсем тупой, раз пытался дергаться в правильном направлении поставив Longint :(
Ответить