То чего не может быть ...

Clarion, Clarion 7

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

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

То чего не может быть ...

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

Привет всем !

Возник забавный вопрос, возможно глупый, но не простой ...

Есть функция EXISTS( файл ) с помощью которой можно проверить наличие файла или папки. Прекрасно !
Но если этот файл или папка на диске имеет аттрибут СКРЫТЫЙ (HIDE), то она его не видит.
А как можно проверить наличие файла в скрытой папке ?!

Заранее спасибо за идею .... :)
Make Clarion Great Again ! 😎
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: То чего не может быть ...

Сообщение Admin »

Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: То чего не может быть ...

Сообщение Yufil »

Через функцию Directory с параметром ReadOnly
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: То чего не может быть ...

Сообщение Yufil »

hidden, конечно...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: То чего не может быть ...

Сообщение WadimZapara »

Давным-давно в тридесятом королевстве... :D
Короче, сделал и забыл:

Код: Выделить всё

! 1. идентификаторы доступа к файлу
GENERIC_READ      EQUATE(80000000h)
GENERIC_WRITE     EQUATE(40000000h)
GENERIC_EXECUTE   EQUATE(20000000h)
GENERIC_ALL       EQUATE(10000000h)

! 2. цели вызова функции CreateFile()
CREATE_NEW        Equate(1) ! создать новый, если не существует    (при существ. НЕ СРАБОТАЕТ-ошибка с кодом  80)
CREATE_ALWAYS     Equate(2) ! создавать новый всегда               (при существ.    СРАБОТАЕТ-ошибка с кодом 183)
OPEN_EXISTING     Equate(3) ! открыть существующий                 (при отсутств.НЕ СРАБОТАЕТ-ошибка с кодом   2)
OPEN_ALWAYS       Equate(4) ! открыть всегда                       (при существ.    СРАБОТАЕТ-ошибка с кодом 183)
                            !                                      (при отсутств.СОЗДАЁТ     -ошибка с кодом   0)
TRUNCATE_EXISTING Equate(5) ! открыть и усечь (треб.GENERIC_WRITE) (при отсутств.НЕ СРАБОТАЕТ-ошибка с кодом   2)

! 3. атрибуты файлов
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)

! 4. идентификаторы разрешений совместного доступа к файлу
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)

! 5. плохой Handle
INVALID_HANDLE_VALUE    Equate(0FFFFFFFFh)

FILETIME   Group,Type  ! "файловое время"
dwLowDateTime  ULong
dwHighDateTime ULong
           End

SYSTEMTIME Group,Type  ! "системное время"
wYear          Word    ! год
wMonth         Word    ! месяц
wDayOfWeek     Word    ! день недели
wDay           Word    ! число
wHour          Word    ! час
wMinute        Word    ! минута
wSecond        Word    ! секунда
wMilliseconds  Word    ! миллисекунда
           End


   MAP
      MODULE('Windows.DLL')
         CreateFile(*CString lpFileName, ULONG dwDesiredAccess, ULONG dwShareMode, |
                    ULONG Addr_SecurityAttributes=0, ULONG dwCreationDisposition, ULONG dwFlagsAndAttributes, |
                    UnSigned hTemplateFile=0),UnSigned, PASCAL,RAW,Name('CreateFileA'),DLL(TRUE)
         GetFileSize(UnSigned hFile, ULONG Addr_FileSizeHigh=0),ULONG, PASCAL,RAW,DLL(TRUE)
         GetFileTime(UnSigned hFile, *FILETIME lpCreationTime, |
                                     ULong lpLastAccessTime=0, |
                                     ULong lpLastWriteTime=0),BOOL, PASCAL,RAW,DLL(TRUE),proc
         FileTimeToSystemTime(*FILETIME lpFileTime, *SYSTEMTIME lpSystemTime), BOOL, PASCAL,RAW,DLL(TRUE),proc
         CloseHandle(UnSigned Handle), BOOL, Raw,Pascal,DLL(TRUE), Proc
      END
      FileFound_LenDate(String FullNameOfFileWithExt, <*ULong Bytes>, <*Long CreationDate>), Byte, Name('FileFound_LenDate@WMZapara')
   END

!*****************************************************************************************
FileFound_LenDate     FUNCTION (String FullNameOfFileWithExt, <*ULong Bytes>, <*Long CreationDate>) !, Byte
ret         Byte(FALSE)
hFile       UnSigned
lpcFileName CString(256)
CreationDateTime  Group(FILETIME).
FileSystemTime    Group(SYSTEMTIME).
!*****************************************************************************************
  CODE
  lpcFileName = FullNameOfFileWithExt
  hFile = CreateFile(lpcFileName, GENERIC_READ, FILE_SHARE_BOTH, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL)
  If hFile <> INVALID_HANDLE_VALUE Then ! Нет ошибки
    ret += 1
    If ~Omitted(2) Then Bytes = GetFileSize(hFile).
    If ~Omitted(3) Then
      GetFileTime(hFile, CreationDateTime)
      FileTimeToSystemTime(CreationDateTime, FileSystemTime)
      CreationDate = Date(FileSystemTime.wMonth, FileSystemTime.wDay, FileSystemTime.wYear)
    End
    CloseHandle(hFile)
  Else
    If ~Omitted(2) Then Clear(Bytes).
    If ~Omitted(3) Then Clear(CreationDate).
  End
 Return(ret)
!*** End Of FoundFile ********************************************************************
Работает идеально, если нет запрета в NTFS на открытие файла
Заодно может возвращать длину файла и дату создания
P.S. ничего менять не нужно. "лишние" константы - даны для общего развития :D
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Ответить