Форум: "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