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

Вниз

Как пользоваться функцией GetFileSize   Найти похожие ветки 

 
Олежек   (2005-06-07 17:50) [0]

Читал хелп, но там не понятно!


 
Gero ©   (2005-06-07 18:01) [1]

Что не понятно?


 
ZlDoc ©   (2005-06-07 18:05) [2]

Открывать файл и передавать дескриптор файла GetFileSize. Или пользоваться TFileStream.


 
xShadow ©   (2005-06-07 18:21) [3]

Function xGetFileSize( const FileName: String ): Int64;
var S: TSearchRec;
Begin
   FindFirst( FileName, faAnyFile, S );
   Result := ( Int64( S.FindData.nFileSizeHigh ) * MAXDWORD ) +
               Int64( S.FindData.nFileSizeLow );
   FindClose( S );
end;


 
VMcL ©   (2005-06-07 18:37) [4]

>>xShadow ©   (07.06.05 18:21) [3]

У Вас неправильный код.


 
GLFox ©   (2005-06-07 18:50) [5]

Что непонятно, то? Чтобы юзать функцию, надо получить hFile.
А он получается из CreateFile (см. Win32 SDK).


 
ZlDoc ©   (2005-06-07 18:58) [6]

>>xShadow ©   (07.06.05 18:21) [3]


...
Result:=S.Size;
...


Но, ИМХО, это не самый оптимальный вариант.


 
ZlDoc ©   (2005-06-07 19:00) [7]

>>GLFox ©   (07.06.05 18:50) [5]

CreateFile Создает файл с 0 размером. А чтобы получить размер существующего нужна FileOpen.


 
GLFox ©   (2005-06-07 19:04) [8]

>>ZlDoc ©   (07.06.05 19:00) [7]

В CreateFile есть такой параметр: dwCreationDisposition.
Если его установить в OPEN_EXISTING, то все будет как надо.


 
ZlDoc ©   (2005-06-07 19:12) [9]

GLFox ©   (07.06.05 19:04) [8]

Всеравно это приведет к неявному вызову FileOpen. Зачем лишнее выполнять.


 
GLFox ©   (2005-06-07 19:19) [10]

>>ZlDoc ©   (07.06.05 19:12) [9]
Что-то я не замечал такой функции в Win32. А если речь идет о дельфийской FileOpen, то скорее всего, наоборот она вызывает CreateFile.


 
n0name   (2005-06-07 19:26) [11]

>>ZlDoc ©   (07.06.05 19:12) [9]
Уверен?
По-мойму это приведйт к вызову NtCreateFile.
А дальше идёт IoCreateFile.
NtOpenFile также обращается к IoCreateFile.
Но CreateFile и OpenFile никак не взаимодействуют(Сооьтветственно NtCreateFile и NtOpenFile).


 
ZlDoc ©   (2005-06-07 19:30) [12]

Возможно прогнался. Пойду проверю.


 
Олежек   (2005-06-07 20:20) [13]

Хендл файла я передаю, а размер то как узнать?

там написано
If the function succeeds, the return value is the low-order doubleword of the file size, and, if lpFileSizeHigh is non-NULL, the function puts the high-order doubleword of the file size into the variable pointed to by that parameter.
If the function fails and lpFileSizeHigh is NULL, the return value is 0xFFFFFFFF. To get extended error information, call GetLastError.
If the function fails and lpFileSizeHigh is non-NULL, the return value is 0xFFFFFFFF and GetLastError will return a value other than NO_ERROR.

что еще за low-order doubleword, размер ведь должен возвращаться в dword...


 
Олежек   (2005-06-07 20:28) [14]

Я проверил, размер возвращается правильный и у файлов больших чем 64 кб, только смущает фраза
If the function succeeds, the return value is the low-order doubleword of the file size


 
ZlDoc ©   (2005-06-07 20:37) [15]

>>Олежек   (07.06.05 20:28) [14]
Это значит, что если функция выполнилась успешно, то врзвращаеься младшее слово размера. Старшее по ходу возвращается через параметр.


> GLFox ©


> n0name   (07.06.05 19:26) [11]

Вы абсолютно правы. Есть API фукци OpenFile. Но она так же вызывает CreateFile.


 
ZlDoc ©   (2005-06-07 20:39) [16]


> младшее слово

2слова


 
n0name   (2005-06-08 06:21) [17]

>>Олежек   (07.06.05 20:28) [14]
Второй параметр старшый DWORD размера.
Он тебе понадобиться если размер больше 4GB(а не 64Kb, откуда такая цифра?). Вот пример

...
var
RealSize: Int64;
LoDWORD, HiDWORD: DWORD;
...
begin
...
LoDWORD:=GetFileSize(hFile, @HiDWORD);
RealSize:=LoDWORD+HiDWORD*DWORD(-1);
...
end;


 
xShadow ©   (2005-06-08 08:48) [18]


> xShadow ©   (07.06.05 18:21) [3]

Тогда ошибка в справке от Delphi


 
Anatoly Podgoretsky ©   (2005-06-08 09:01) [19]

ZlDoc ©   [9] [15]

FileOpen - The FileOpen macro displays the Open dialog

OpenFile - This function is provided for compatibility with 16-bit versions of Windows.


 
Romick   (2005-06-15 12:28) [20]

function GetFileSizeRmk( const FileName: String ): Integer;
var
 h : integer;
Begin
 h:=FileOpen(FileName,64);
 result:= GetFileSize(h,nil);
end;//Стопудово работает !!!

Пользуйся,
и не слушай их всех ...       :)


 
Virgo_Style ©   (2005-06-15 12:37) [21]

Romick   (15.06.05 12:28) [20]
//Стопудово работает !!!


Есть такое подозрение, что недолго. Иначе с чего бы это в примерах к FileOpen использовалась еще и FileClose ?


 
Fay ©   (2005-06-15 15:43) [22]

2 Romick   (15.06.05 12:28) [20]
FileOpen(FileName,64) - что за волшебное число?
Нельзя по-русски написать?


 
Fay ©   (2005-06-15 15:46) [23]

2 n0name   (08.06.05 6:21) [17]
>> HiDWORD*DWORD(-1)
Зверство фашистское!


 
Fay ©   (2005-06-15 16:16) [24]

Что-то типа этого
var
 li : LARGE_INTEGER;
 h, le : DWORD;
begin
 li.QuadPart := 0;
 h := CreateFile(PChar(edFileName.Text), 0, 0, nil, OPEN_EXISTING, 0, 0);
 if h = INVALID_HANDLE_VALUE then
   RaiseLastOSError;
 try
   li.LowPart := GetFileSize(h, @li.HighPart);
   le := GetLastError;
   if (li.LowPart = INVALID_FILE_SIZE) and (le <> NO_ERROR) then
     raise Exception.Create(SysErrorMessage(le));
 finally
   CloseHandle(h);
 end;
 ShowMessage(IntToStr(li.QuadPart));


 
Romick   (2005-06-16 09:32) [25]


> Есть такое подозрение, что недолго. Иначе с чего бы это
> в примерах к FileOpen использовалась еще и FileClose ?

Просто забыл дописать , такое бывает со всеми...
> FileOpen(FileName,64) - что за волшебное число?

fmOpenRead, так нормально ?


 
Fay ©   (2005-06-16 14:04) [26]

Romick   (16.06.05 9:32) [25]
Так правильно. Только зачем его читать и кто будет закрывать?



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

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.041 c
1-1122291352
ZSergey
2005-07-25 15:35
2005.08.14
Изменение глобальных констант.


1-1122280286
Sheverev
2005-07-25 12:31
2005.08.14
Создание кнопки ОБЗОР...


14-1121230858
cvg
2005-07-13 09:00
2005.08.14
Где взять mysql.dcu?


14-1122048405
PlayBoy
2005-07-22 20:06
2005.08.14
Отличие между поверкой и проверкой?


14-1122001061
NewWonder
2005-07-22 06:57
2005.08.14
Пишу экзамен!