Форум: "Основная";
Текущий архив: 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