![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как пользоваться функцией GetFileSize [D6, WinXP]
Олежек © (2005-06-07 17:50:00)Читал хелп, но там не понятно!
Fay (2005-06-16 14:04:00) [1]Romick (16.06.05 9:32) [25]
Так правильно. Только зачем его читать и кто будет закрывать?
Romick (2005-06-16 09:32:00) [2]
> Есть такое подозрение, что недолго. Иначе с чего бы это
> в примерах к FileOpen использовалась еще и FileClose ?
Просто забыл дописать , такое бывает со всеми...
> FileOpen(FileName,64) - что за волшебное число?
fmOpenRead, так нормально ?
Fay (2005-06-15 16:16:00) [3]Что-то типа этого
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));
Fay (2005-06-15 15:46:00) [4]2 n0name (08.06.05 6:21) [17]
>> HiDWORD*DWORD(-1)
Зверство фашистское!
Fay (2005-06-15 15:43:00) [5]2 Romick (15.06.05 12:28) [20]
FileOpen(FileName, 64) - что за волшебное число?
Нельзя по-русски написать?
Virgo_Style (2005-06-15 12:37:00) [6]Romick (15.06.05 12:28) [20]
//Стопудово работает !!!
Есть такое подозрение, что недолго. Иначе с чего бы это в примерах к FileOpen использовалась еще и FileClose ?
Romick (2005-06-15 12:28:00) [7]function GetFileSizeRmk( const FileName: String ): Integer;
var
h : integer;
Begin
h:=FileOpen(FileName,64);
result:= GetFileSize(h,nil);
end;//Стопудово работает !!!
Пользуйся,
и не слушай их всех ... :)
Anatoly Podgoretsky (2005-06-08 09:01:00) [8]ZlDoc © [9] [15]
FileOpen - The FileOpen macro displays the Open dialog
OpenFile - This function is provided for compatibility with 16-bit versions of Windows.
xShadow (2005-06-08 08:48:00) [9]
> xShadow © (07.06.05 18:21) [3]
Тогда ошибка в справке от Delphi
n0name (2005-06-08 06:21:00) [10]>>Олежек (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;
ZlDoc (2005-06-07 20:39:00) [11]
> младшее слово
2слова
ZlDoc (2005-06-07 20:37:00) [12]>>Олежек (07.06.05 20:28) [14]
Это значит, что если функция выполнилась успешно, то врзвращаеься младшее слово размера. Старшее по ходу возвращается через параметр.
> GLFox ©
> n0name (07.06.05 19:26) [11]
Вы абсолютно правы. Есть API фукци OpenFile. Но она так же вызывает CreateFile.
Олежек (2005-06-07 20:28:00) [13]Я проверил, размер возвращается правильный и у файлов больших чем 64 кб, только смущает фраза
If the function succeeds, the return value is the low-order doubleword of the file size
Олежек (2005-06-07 20:20:00) [14]Хендл файла я передаю, а размер то как узнать?
там написано
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...
ZlDoc (2005-06-07 19:30:00) [15]Возможно прогнался. Пойду проверю.
n0name (2005-06-07 19:26:00) [16]>>ZlDoc © (07.06.05 19:12) [9]
Уверен?
По-мойму это приведйт к вызову NtCreateFile.
А дальше идёт IoCreateFile.
NtOpenFile также обращается к IoCreateFile.
Но CreateFile и OpenFile никак не взаимодействуют(Сооьтветственно NtCreateFile и NtOpenFile).
GLFox (2005-06-07 19:19:00) [17]>>ZlDoc © (07.06.05 19:12) [9]
Что-то я не замечал такой функции в Win32. А если речь идет о дельфийской FileOpen, то скорее всего, наоборот она вызывает CreateFile.
ZlDoc (2005-06-07 19:12:00) [18]GLFox © (07.06.05 19:04) [8]
Всеравно это приведет к неявному вызову FileOpen. Зачем лишнее выполнять.
GLFox (2005-06-07 19:04:00) [19]>>ZlDoc © (07.06.05 19:00) [7]
В CreateFile есть такой параметр: dwCreationDisposition.
Если его установить в OPEN_EXISTING, то все будет как надо.
ZlDoc (2005-06-07 19:00:00) [20]>>GLFox © (07.06.05 18:50) [5]
CreateFile Создает файл с 0 размером. А чтобы получить размер существующего нужна FileOpen.