Главная страница
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.047 c
1-1122059658
Spartak
2005-07-22 23:14
2005.08.14
Глюки TListView


1-1121941758
Ded Moroz
2005-07-21 14:29
2005.08.14
Проблема с плагинами


1-1122532937
Reals
2005-07-28 10:42
2005.08.14
Удаление из файла информации определенного размера


11-1105130752
Slay
2005-01-07 23:45
2005.08.14
2Владимир Кладов: Не работает DecInt64()


1-1122449889
ChI
2005-07-27 11:38
2005.08.14
определение номера введёного символа