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

Вниз

Как пользоваться функцией 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
4-1118655501
ATarget
2005-06-13 13:38
2005.08.14
остановить драйвер


5-1092908728
Alexander S.
2004-08-19 13:45
2005.08.14
Кто как компоненты компилирует


4-1118656245
gdaujk
2005-06-13 13:50
2005.08.14
Окно на передний план !


3-1120833608
GEN++
2005-07-08 18:40
2005.08.14
Проблема при открытии


1-1122412114
Riant
2005-07-27 01:08
2005.08.14
Ширина символа





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