Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно определить размер файла?


ИМХО ©   (2004-11-15 17:36:00) 

Как можно определить размер файла?
FileSize, пожалуйста, не предлагать.


begin...end   (2004-11-15 21:00:00) [1]


> [18] ИМХО ©   (15.11.04 20:48)

Ну и что, файл только для тебя текстовый; можно использовать, например, file of Byte, и применить FileSize.

Если же задача поставлена так, что существует переменная F: TextFile, и для определения размера нужно использовать именно её, то тут, по-моему, не поможет ни один из уже предложенных способов.


ИМХО   (2004-11-15 20:48:00) [2]

FileSize не работает с текстовыми


begin...end   (2004-11-15 20:39:00) [3]


> [14] ИМХО ©   (15.11.04 20:30)

> у меня Delphi 5

А чего ж ты сразу не сказал, ответы могли бы быть несколько другими. Кроме этого, нужно было указать версию ОС, т.к., например, GetFileSizeEx нет на Windows 95/98.

> [16] ИМХО ©   (15.11.04 20:32)

Ну вот, обещал заценить код, а место этого задаёшь дополнительные вопросы.

Помимо всего этого, до сих пор непонятно, почему у тебя аллергия на FileSize.


ИМХО   (2004-11-15 20:32:00) [4]


> GuAV ©   (15.11.04 19:56) [12]
> GuAV ©   (15.11.04 19:52) [11]
> Int64
> убрать.


что убрать, не понял


begin...end   (2004-11-15 20:31:00) [5]


> [12] GuAV ©   (15.11.04 19:56)

Почему 2,1 ГБ, разве не 4294967295 байт (4 ГБ)?


ИМХО   (2004-11-15 20:30:00) [6]

у меня Delphi 5, там нет FileSizeByName


begin...end   (2004-11-15 20:02:00) [7]


> [5] ИМХО ©   (15.11.04 19:06)

Так может не пойти, почему - см. [8], но приведённая тобой функция совершенно аналогична (по реализации) функции FileSizeByName, о которой я уже упоминал.

Если твоя задача состоит в коллекционировании таких функций, могу предложить ещё одну:

function MyFileSize(Path: String): Integer;
begin
 Result := FileSizeByName(Path) + 1;
 Dec(Result)
end.


> [11] GuAV ©   (15.11.04 19:52)

В общем случае не пойдёт, откуда ты знаешь, может у него огромный файл?


GuAV   (2004-11-15 19:56:00) [8]

GuAV ©   (15.11.04 19:52) [11]
Int64

убрать.

а если нужно >2.1 ГБ, то учеть и nFileSizeHigh


GuAV   (2004-11-15 19:52:00) [9]

procedure TForm1.FormCreate(Sender: TObject);
var h: THandle; W32D: TWin32FindData;
begin
 h := FindFirstFile('C:\WIN386.SWP', W32D);
 if h = INVALID_HANDLE_VALUE then RaiseLastOSError;
 Windows.FindClose(h);
 Caption := Format('Size = %d', [Int64(W32D.nFileSizeLow)]);
end;


ИМХО   (2004-11-15 19:23:00) [10]


> GuAV ©   (15.11.04 19:13) [8]
> Лучше всего через FindFirstFile - не открывая даже файл,
> а то он может быть открыт с апретом а последующее чтение.


дай заценить код, плиз


GuAV   (2004-11-15 19:15:00) [11]

ИМХО ©   (15.11.04 19:12) [6]
или есть подводные камни?

Посмотри размер своп-файла.
Если через хэндл то IMHO лучше с правами FILE_READ_ATTRIBUTES


GuAV   (2004-11-15 19:13:00) [12]

Лучше всего через FindFirstFile - не открывая даже файл, а то он может быть открыт с апретом а последующее чтение.


novice_man   (2004-11-15 19:12:00) [13]

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

TSearchRec = record
 Time: Integer;
 Size: Integer; <<<---- размер
 Attr: Integer;
 Name: TFileName;
 ExcludeAttr: Integer;
 FindHandle: THandle;
 FindData: TWin32FindData;
end;


ИМХО   (2004-11-15 19:12:00) [14]

или есть подводные камни?


ИМХО   (2004-11-15 19:06:00) [15]

вот так пойдет, как считаете:

function MyGetFileSize(FileName: string): Integer;
var
 FS: TFileStream;
begin
 FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
 try
   Result := FS.Size;
 finally
   FS.Free;
 end;
end;


GuAV   (2004-11-15 18:59:00) [16]

GetFileSizeEx

и эта... колись в чём развод на этот раз ;-)


Rem   (2004-11-15 18:50:00) [17]

Открыть файл, загнать указатель в конец файла и определить его (указателя) позицию.


ИМХО   (2004-11-15 18:26:00) [18]

еще варианты


begin...end   (2004-11-15 17:39:00) [19]


> ИМХО ©   (15.11.04 17:36)

1. GetFileSize.
2. FindFirstFile с последующим просмотром TWin32FindData.
3. FileSizeByName (версию Delphi, в которой она есть, не помню).


Наверх

Титульная страница Поиск, карта сайта Написать письмо