Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
ИМХО ©   (2004-11-15 17:36) [0]

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


 
begin...end ©   (2004-11-15 17:39) [1]


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

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


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

еще варианты


 
Rem ©   (2004-11-15 18:50) [3]

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


 
GuAV ©   (2004-11-15 18:59) [4]

GetFileSizeEx

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


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

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

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;


 
ИМХО ©   (2004-11-15 19:12) [6]

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


 
novice_man ©   (2004-11-15 19:12) [7]

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;


 
GuAV ©   (2004-11-15 19:13) [8]

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


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

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

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


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


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


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


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

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;


 
GuAV ©   (2004-11-15 19:56) [12]

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

убрать.

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


 
begin...end ©   (2004-11-15 20:02) [13]


> [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)

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


 
ИМХО ©   (2004-11-15 20:30) [14]

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


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


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

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


 
ИМХО ©   (2004-11-15 20:32) [16]


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


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


 
begin...end ©   (2004-11-15 20:39) [17]


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

> у меня Delphi 5

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

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

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

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


 
ИМХО ©   (2004-11-15 20:48) [18]

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


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


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

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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.044 c
1-1102957836
Павел
2004-12-13 20:10
2004.12.26
Как вызвать действие связанное с нажатием кнопки?


1-1102916467
Sicwell
2004-12-13 08:41
2004.12.26
Создать поток в DLL


14-1102159316
Труп Васи Доброго
2004-12-04 14:21
2004.12.26
Клиент форума "Magic Forum" 1.2


1-1102569190
PEKAHT
2004-12-09 08:13
2004.12.26
MSSQL


1-1102869888
markers
2004-12-12 19:44
2004.12.26
Выяснение версии Office





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский