![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно определить размер файла?
ИМХО © (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, в которой она есть, не помню).