Народ чем можно работать с такими файлами
System.FileSize(F) вместо 5, 1 гига показывает 1.2 Гига
узнать размер файла который больше 5 гигибай
Модератор: Модераторы
TFileStream
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
stikriz писал(а):TFileStream
Это еще зачем?
FileSize работает нормально и возвращает int64.
Я подозреваю, что файл был объявлен неправильно. См. пример ниже.
Код: Выделить всё
var f:file of byte;
begin
AssignFile(f, 'bigfile.dat');
reset(f);
writeln( FileSize(f) );
CloseFile(f);
Вот кусок кода, работающего прекрасно на размерах до 4 гиг
(freepascal 2.4.0, даже функцию FileSize(FF) вызываю через System, но
размер показывает не правильно )
Операционка winxp sp3,
причем на С функция ftell(ff) после seek(ff,0,2) вообще возвращает размер 0
при размере файла 5 434 731 549 байт показывает 1 139 764 253 байта
такое впечатление что что-то с операционкой
Добавлено спустя 32 минуты 42 секунды:
проверил на Мандриве 2010.2 тоже не правильный размер файла показывает
(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 тоже не правильный размер файла показывает
Моя система:
Windows XP Sp3.
Lazarus SVN: 28824
Тобишь он использует FPC 2.4.2
Вот код:
Для слабоверующих код всей формы:
Для тех кому и этого мало вот скрины:
Скрин св-ва файла весом 34 Гига.. Мне показалось что 34 > 5

А вот уже скрин, программы, код которой приведен выше:

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
alexmai писал(а):Вот кусок кода, работающего прекрасно на размерах до 4 гиг
(freepascal 2.4.0, даже функцию FileSize(FF) вызываю через System, но
размер показывает не правильно )
Тип longint размером 32 бит, а FileSize для больших файлов возвращает число, не влезающее в размер 32 бит. Я же не просто так предложил использовать тип int64.
Такие баги элементарно отслеживаются компилятором. Так что обращайте внимание на предупреждения и _не_ отключайте range/overflow checks.
MageSlayer писал(а):alexmai писал(а):Вот кусок кода, работающего прекрасно на размерах до 4 гиг
Тип longint размером 32 бит, а FileSize для больших файлов возвращает число, не влезающее в размер 32 бит. Я же не просто так предложил использовать тип int64.
Такие баги элементарно отслеживаются компилятором. Так что обращайте внимание на предупреждения и _не_ отключайте range/overflow checks.
Спасибо MageSlayer большое , хорошо что дал комментарий для слабоумным, закомплексованность состояла в том что я был уверен что 32 битного целого хватит, а проверить не хватило аккуратности.
Одно радует, что я еще не совсем тупой, раз пытался дергаться в правильном направлении поставив Longint
