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

Вниз

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

 
Александр из Минска   (2003-09-13 19:52) [0]

Как узнать размер файла в байтах? Довольно простой вопрос, а я на него ответ не знаю.


 
pasha_golub   (2003-09-13 19:55) [1]

FindFirst+FileNext+F1
or
AsiignFile+Reset+FileSize+F1


 
me   (2003-09-13 20:17) [2]

function GetFileSize(const FileName : string) : Int64;
var
Handle : THandle;
FindData : TWin32FindData;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
if Handle <> INVALID_HANDLE_VALUE then begin
Windows.FindClose(Handle);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
Int64Rec(Result).Lo := FindData.nFileSizeLow;
Int64Rec(Result).Hi := FindData.nFileSizeHigh;
Exit;
end;
end;
Result := -1;
end;


 
Александр из Минска   (2003-09-15 14:57) [3]

Спасибо, но я уже узнал более подходящий для меня метод:
var
strm : TMemoryStream;
begin
strm := TMemoryStream.Create;
strm.LoadFromFile("1.txt");
ShowMessage("Размер файла: "+IntToStr(strm.Size));
FreeAndNil(strm);
end;


 
[lamer]Barmaglot   (2003-09-15 14:58) [4]

GetFileSize?


 
Dimka Maslov   (2003-09-15 15:06) [5]

>Александр из Минска © (15.09.03 14:57) [3]
Для Вас метод может быть и подходящий, но что будет если размер файла окажется большим? А если файлов много? Торможение системы? Способов много но РАЦОНАЛЬНЫЙ предложен me (13.09.03 20:17) [2]


 
[lamer]Barmaglot   (2003-09-15 15:10) [6]

to Dimka Maslov
FindFirst лучше, чем Специализированная GetFileSize???????


 
Dimka Maslov   (2003-09-15 15:14) [7]

>[lamer]Barmaglot © (15.09.03 15:10) [6]
GetFileSize требует октрытия файла, что может невозможно если файл уже открыт друим приложением с запретом на чтение.


 
[lamer]Barmaglot   (2003-09-15 15:20) [8]

dwDesiredAccess :=0; ??????????

Или я чего-то не понимаю?


 
han_malign   (2003-09-15 15:24) [9]

GetFileAttributes Ex


 
Dimka Maslov   (2003-09-15 15:26) [10]

Открытие файла более длительный и ресурсоёмкий процесс через обращение к операционной системе через FindFirstFile. Но вот как объяснить эту челу, для которого такой вот метод "более подходящий"


 
[lamer]Barmaglot   (2003-09-15 15:31) [11]

Нет просто это не логично. Если ставится без реального доступа (dwDesiredAccess :=0) то открытия файла не происходит... (Specifies device query access to the object. An application can query device attributes without accessing the device.) При этом получишь именно размер файла. А FindFirst кроме размера получит ещё море ненужной информации...

Ты лично замерял время затрачивоемое процедурой на то и на это? Или тогда объясни откуда данные, что FindFirst быстрее...


 
han_malign   (2003-09-15 16:05) [12]

> Ты лично замерял время затрачивоемое процедурой на то и на это? Или тогда объясни откуда данные, что FindFirst быстрее...
- я лично замерял - абсолютно монопенисуально, всеми способами до 20 мсек, чаще меньше мсек (Проверял GetTickCount, с RDTSC влом заморачиваться было)
program fsizez;
{$APPTYPE CONSOLE}
uses Windows,Utils;
var
hF: THandle;
FD: TWin32FindData;
FSZ,i: integer;
_t: DWORD;
begin
for i:=0 to 7 do begin
FSZ:=0; _t:=GetTickCount;
hF:=THandle(FindFirstFile(PChar(ParamStr(1)),FD));
_t:=GetTickCount-_t;
if((hF<>INVALID_HANDLE_VALUE))then begin
FSZ:=FD.nFileSizeLow;
CloseHandle(hF);
end;
Writeln("FFF "+IntStr(FSZ)+" >>> "+IntStr(_t));

FSZ:=0; _t:=GetTickCount;
hF:=CreateFile(PChar(ParamStr(1)),0,0,nil,OPEN_EXISTING,0,0);
if((hF<>INVALID_HANDLE_VALUE))then begin
FSZ:=GetFileSize(hF,nil);
_t:=GetTickCount-_t;
CloseHandle(hF);
end;
Writeln("GFS "+IntStr(FSZ)+" >>> "+IntStr(_t));

FSZ:=0; _t:=GetTickCount;
hF:=CreateFile(PChar(ParamStr(1)),GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
if((hF<>INVALID_HANDLE_VALUE))then begin
FSZ:=SetFilePointer(hF,0,nil,FILE_END);
_t:=GetTickCount-_t;
CloseHandle(hF);
end;
Writeln("SFP "+IntStr(FSZ)+" >>> "+IntStr(_t));
end;
end.


 
Palladin   (2003-09-15 16:16) [13]


> Александр из Минска © (15.09.03 14:57) [3]

И какие же положительные моменты этого подхода выявлены?


 
Song   (2003-09-15 16:23) [14]

Function GetFSize(S: String): LongInt;
Var FHandle: THandle;
Begin
Result:=0;
FHandle:=CreateFile(PChar(S),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
IF FHandle<>INVALID_HANDLE_VALUE then
try
Result:=GetFileSize(FHandle,nil);
finally
CloseHandle(FHandle);
end;
End;


 
[lamer]Barmaglot   (2003-09-15 17:28) [15]

to han_malign

hF:=CreateFile(PChar(ParamStr(1)), GENERIC_READ,0,nil,OPEN_EXISTING,0,0);

Зачем генерик реад, если тебе не надо с ним работать? почему не поставить 0????

P.S. В любом случае приду домой замерю, вы меня озадачили...


 
Игорь Шевченко   (2003-09-15 18:53) [16]

[lamer]Barmaglot © (15.09.03 17:28)

> Зачем генерик реад, если тебе не надо с ним работать?


Может быть затем, чтобы другим не дать писать/изменять атрибуты файла в этот момент ? :)


 
[lamer]Barmaglot   (2003-09-16 09:13) [17]

Действительно, FindFirst самый быстрый. GetFileAttributesEx где-то на 20% медленнее, а GetFileSize в 1,5-2раза медленнее FindFirst.

P.S. Никогда бы не подумал. Век живи век учись и все равно ламером помрешь...


 
han_malign   (2003-09-16 10:18) [18]

> Зачем генерик реад, если тебе не надо с ним работать?
- потому как это был третий - "синтетический" вариант:
hF:=CreateFile(PChar(ParamStr(1)), GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
if((hF<>INVALID_HANDLE_VALUE))then begin
FSZ:= SetFilePointer(hF,0,nil,FILE_END);

З.Ы. Самое интересное, что написано про GetFileSize:
hFile
Specifies an open handle of the file whose size is being returned. The handle must have been created with either GENERIC_READ or GENERIC_WRITE access to the file.
- хотя прокатывает и с 0-ем...



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

Форум: "Основная";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.016 c
3-96108
P0tia
2003-09-08 22:25
2003.09.29
Люди, объясните, почему ругается?


8-96302
IGORka
2003-06-02 18:18
2003.09.29
Image - StretchBlt - CopyRect


1-96267
Relaxxx
2003-09-18 10:50
2003.09.29
TreeView


1-96187
petro
2003-09-16 11:26
2003.09.29
richedit


4-96493
Delf
2003-07-25 13:36
2003.09.29
Как узнать ProcessID зная дескриптор (hangle) окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский