Длинна файла
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Re: Длинна файла
Не, BYTES это размер в байтах, а длина наверно LENGTH(file). Ещё можно визуально оценить - длинный файл или не очень.




С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 8034
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Re: Длинна файла
Привет !
Да, BYTES() вернет длину файла после открытия. В теории все правильно. На практике - хуже, т.к. OPEN медленная операция и при обработке файлов потоком тормозит страшно. Ну и еще: нервные антивирусы будут неадекватно реагировать на OPEN например для исполняемых файлов. Проще пойти другим, причем вполне штатным путем.
Код описанной ниже процедуры вернет размер файла в байтах. Надо ли искать проблемы там где их нет ?
Да, BYTES() вернет длину файла после открытия. В теории все правильно. На практике - хуже, т.к. OPEN медленная операция и при обработке файлов потоком тормозит страшно. Ну и еще: нервные антивирусы будут неадекватно реагировать на OPEN например для исполняемых файлов. Проще пойти другим, причем вполне штатным путем.
Код описанной ниже процедуры вернет размер файла в байтах. Надо ли искать проблемы там где их нет ?

Код: Выделить всё
GetFileSize_ PROCEDURE (FileName_)
FIQ QUEUE,PRE(F_IQ)
Name STRING(FILE:MAXFILENAME)
ShortName STRING(13)
Date LONG
Time LONG
Size LONG
Attrib BYTE
END
CODE
DIRECTORY(FIQ, FileName_, FF_:DIRECTORY)
IF RECORDS(FIQ)
GET(FIQ,1)
RETURN FIQ.Size
END
RETURN 0
Make Clarion Great Again ! 
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Длинна файла
Более эффективный и надёжный код:
Поясню: если NTFS-разрешения на каталог "нельзя просматривать", а для файлов "можно читать", то код выше работать не будет.
Однако, выяснять размер файла чтением каталога, что предложено выше, будет исполняется дольше, чем нижеприведённый код.
Ещё дольше будет работать более раннее и в общем-то правильное предложение через кларионовские OPEN() и BYTES(), но надёжность отработки - выше, чем через чтение каталога.
Поясню: если NTFS-разрешения на каталог "нельзя просматривать", а для файлов "можно читать", то код выше работать не будет.
Однако, выяснять размер файла чтением каталога, что предложено выше, будет исполняется дольше, чем нижеприведённый код.
Ещё дольше будет работать более раннее и в общем-то правильное предложение через кларионовские OPEN() и BYTES(), но надёжность отработки - выше, чем через чтение каталога.
Код: Выделить всё
MAP
MODULE('WINDOWS')
CreateFile(*CString lpFileName, ULONG dwDesiredAccess, ULONG dwShareMode, |
ULONG Addr_SecurityAttributes=0, ULONG dwCreationDisposition, ULONG dwFlagsAndAttributes, |
UnSigned hTemplateFile=0),UnSigned, PASCAL,RAW,Name('CreateFileA'),DLL
GetFileSize(UnSigned hFile, ULONG Addr_FileSizeHigh=0),ULONG, PASCAL,DLL
END !MODULE
END !MAP
INVALID_HANDLE_VALUE EQUATE(-1)
GENERIC_READ EQUATE(80000000h)
FILE_SHARE_NONE Equate(0)
FILE_SHARE_READ Equate(1)
FILE_SHARE_WRITE Equate(2)
FILE_SHARE_DELETE Equate(4)
FILE_SHARE_BOTH Equate(FILE_SHARE_READ + FILE_SHARE_WRITE)
FILE_SHARE_ALL Equate(FILE_SHARE_BOTH + FILE_SHARE_DELETE)
OPEN_EXISTING Equate(3) ! открыть существующий (при отсутств.НЕ СРАБОТАЕТ-ошибка с кодом 2)
FILE_ATTRIBUTE_READONLY EQUATE(00000001h)
FILE_ATTRIBUTE_HIDDEN EQUATE(00000002h)
FILE_ATTRIBUTE_SYSTEM EQUATE(00000004h)
FILE_ATTRIBUTE_ARCHIVE EQUATE(00000020h)
FILE_ATTRIBUTE_NORMAL EQUATE(00000080h)
FILE_ATTRIBUTE_TEMPORARY EQUATE(00000100h) ! временный
FILE_ATTRIBUTE_OFFLINE EQUATE(00001000h) ! данные немедленно недоступны (в дальнем хранилище)
FILE_ATTRIBUTE_ENCRYPTED EQUATE(00004000h)
!*****************************************************************************************
FileLengthInBytes FUNCTION (String FullNameOfFile, <*ULong Bytes>), LONG ! 0=найден/иначе код ошибки открытия файла
err Long(0)
hFile UnSigned
lpcFileName CString(1024)
!*****************************************************************************************
CODE
lpcFileName = FullNameOfFile
hFile = CreateFile(lpcFileName, GENERIC_READ, FILE_SHARE_BOTH, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL)
If hFile = INVALID_HANDLE_VALUE Then ! Ошибка
err = GetLastError()
If ~Omitted(2) Then Clear(Bytes).
Else
If ~Omitted(2) Then Bytes = GetFileSize(hFile).
CloseHandle(hFile)
End
Return(err)
Компьютер имеет то преимущество перед мозгом, что им пользуются...