Страница 1 из 1

Длинна файла

Добавлено: 17 Февраль 2010, 3:43
Lenkov
С6.3 ABC 9056
Как узнать длинну файла на диске?

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

Добавлено: 17 Февраль 2010, 8:18
George
BYTES(file)

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

Добавлено: 17 Февраль 2010, 10:04
Дед Пахом
Не, BYTES это размер в байтах, а длина наверно LENGTH(file). Ещё можно визуально оценить - длинный файл или не очень.
:D :D :D

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

Добавлено: 17 Февраль 2010, 11:05
StillZero
BYTES
Return Data Type: LONG
LONG мало ... по API не скажу сразу

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

Добавлено: 17 Февраль 2010, 12:46
Игорь Столяров
Привет !

Да, 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

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

Добавлено: 17 Февраль 2010, 23:43
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)

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

Добавлено: 18 Февраль 2010, 1:05
Lenkov
Спасибо за ответы! В данной задаче мне подойдет команда BITES.