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

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

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

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

Сообщение alexmai » 30.12.2010 12:31:51

Народ чем можно работать с такими файлами
System.FileSize(F) вместо 5, 1 гига показывает 1.2 Гига
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

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

Сообщение stikriz » 30.12.2010 13:21:23

TFileStream
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

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

Сообщение MageSlayer » 30.12.2010 14:10:22

stikriz писал(а):TFileStream

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

FileSize работает нормально и возвращает int64.
Я подозреваю, что файл был объявлен неправильно. См. пример ниже.
Код: Выделить всё
var f:file of byte;
begin
  AssignFile(f, 'bigfile.dat');
  reset(f);

  writeln( FileSize(f) );

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

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

Сообщение alexmai » 31.12.2010 10:34:09

Вот кусок кода, работающего прекрасно на размерах до 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 тоже не правильный размер файла показывает
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

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

Сообщение Maxizar » 31.12.2010 12:24:28

Моя система:
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 :)
Изображение

А вот уже скрин, программы, код которой приведен выше:
Изображение
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение MageSlayer » 31.12.2010 12:38:48

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


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

Такие баги элементарно отслеживаются компилятором. Так что обращайте внимание на предупреждения и _не_ отключайте range/overflow checks.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

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

Сообщение alexmai » 31.12.2010 15:06:48

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


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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru