Длинна файла

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Lenkov
Посетитель
Сообщения: 32
Зарегистрирован: 27 Июнь 2006, 14:56

Длинна файла

Сообщение Lenkov »

С6.3 ABC 9056
Как узнать длинну файла на диске?
George
Активист
Сообщения: 111
Зарегистрирован: 04 Август 2009, 10:48
Благодарил (а): 2 раза

Re: Длинна файла

Сообщение George »

BYTES(file)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Длинна файла

Сообщение Дед Пахом »

Не, BYTES это размер в байтах, а длина наверно LENGTH(file). Ещё можно визуально оценить - длинный файл или не очень.
:D :D :D
С уважением, ДП
Аватара пользователя
StillZero
Ветеран
Сообщения: 458
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Поблагодарили: 1 раз
Контактная информация:

Re: Длинна файла

Сообщение StillZero »

BYTES
Return Data Type: LONG
LONG мало ... по API не скажу сразу
по аэродрому...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8034
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Re: Длинна файла

Сообщение Игорь Столяров »

Привет !

Да, 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: Длинна файла

Сообщение WadimZapara »

Более эффективный и надёжный код:
Поясню: если 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)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Lenkov
Посетитель
Сообщения: 32
Зарегистрирован: 27 Июнь 2006, 14:56

Re: Длинна файла

Сообщение Lenkov »

Спасибо за ответы! В данной задаче мне подойдет команда BITES.
Ответить