Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

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

 
Александр из Минска ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
14-96400
SergP
2003-09-11 13:56
2003.09.29
Все. Бросаем программировать. Прямо сейчас. Ни одной строчки кода


1-96261
ZoKr
2003-09-17 10:41
2003.09.29
Штрих-Код


1-96237
DrWeb
2003-09-11 15:41
2003.09.29
Вопрос о TChart Sereis (или точнее о создани своего типа графико)


14-96445
dtm
2003-09-04 17:43
2003.09.29
Team Source - с чем его есть?


1-96242
Andersen
2003-09-15 14:43
2003.09.29
Как убрать синее выделение в StringGrig?