Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sysrepos
Зарегистрирован: 22.10.2012 Сообщения: 39
|
Добавлено: Пн Сен 09, 2013 4:18 pm Заголовок сообщения: Функции FindFirstFile/FindNextFile и dwFileAttributes |
|
|
Добрый день.
Пытаюсь разобраться с функциями FindFirstFile, FindNextFile, в связи с чем появился вопрос.
1. В описании структуры WIN32_FIND_DATA есть член структуры dwFileAttributes, который может состоять
из некоторых значений, один из которых - FILE_ATTRIBUTE_DIRECTORY, который идентифицирует каталог.
Никак не могу понять как применить его в MapBasic.
Как я понял, чтобы узнать, например, имя файла или папки, найденного функцией FindFirstFile,
нужно использовать WFD.cFileName.
А чтобы узнать, что было найдено - файл или папка, нужно как то использовать
dwFileAttributes и FILE_ATTRIBUTE_DIRECTORY.
Пробовал
print WFD.FILE_ATTRIBUTE_DIRECTORY
print WFD.dwFileAttributes.FILE_ATTRIBUTE_DIRECTORY
print FILE_ATTRIBUTE_DIRECTORY
Пишет ошибка.
Вопрос: как нужно использовать FILE_ATTRIBUTE_DIRECTORY, чтобы узнать, что нашла функция FindFirstFile/FindNextFile, файл или папку?
Описание структуры WIN32_FIND_DATA использовал с сайта
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/str_win32_find_data.htm
Последний раз редактировалось: sysrepos (Чт Сен 12, 2013 9:37 am), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
sysrepos
Зарегистрирован: 22.10.2012 Сообщения: 39
|
Добавлено: Пн Сен 09, 2013 4:21 pm Заголовок сообщения: |
|
|
сам код программы, с которым я эксперементировал
Код: |
'Блок описаний
Include "mapbasic.def"
Include "icons.def"
define MAX_PATH 260
define INVALID_HANDLE_VALUE -1
''''''''''''''''''''''''''''''''''''''''''''''129
Type FILETIME
dwLowDateTime as integer
dwHighDateTime as integer
End Type
Type WIN32_FIND_DATA
dwFileAttributes as integer
ftCreationTime as FILETIME
ftLastAccessTime as FILETIME
ftLastWriteTime as FILETIME
nFileSizeHigh as integer
nFileSizeLow as integer
dwReserved0 as integer
dwReserved1 as integer
cFileName as string * MAX_PATH
cAlternate as string *14
End Type
Declare function FindFirstFile lib "kernel32" alias "FindFirstFileA"
(byval
lpFileName as string,
lpFindFileData as WIN32_FIND_DATA
) as integer
Declare function FindNextFile lib "kernel32" alias "FindNextFileA"(byval
hFindFile as integer,lpFindFileData as WIN32_FIND_DATA) as integer
Declare function FindClose lib "kernel32"(byval hFindFile as integer) as integer
Declare Sub Main
Declare sub SetFOLDER
Declare Sub proc1
dim curPtch as string
dim curFiles() as string
dim curCoordFiles() as string
dim ListLayers() as string
'''''''Главная процедура
Sub Main
curPtch ="" 'путь
Create ButtonPad "bmpOptima" as
PushButton
HelpMsg
"Выбор активной папки с растровыми таблицами\nАктивная папка"
Calling SetFOLDER
ID 2001
Icon MI_ICON_NUMBERS_2
Enable
Show
Fixed
end sub
'''''''Главная процедура
''''''''''''''''''''''''''''''''Процедура выбора папки с растровыми таблицами
sub SetFOLDER
dim k as integer
dim hSearch as integer
dim WFD as WIN32_FIND_DATA
dim cont as logical 'было integer
dim SearchStr as string
'dim curFile as string
'Здесь для определения папки используется диалог выбора файла45 и
'от пользователя потребуется дополнительное действие:
'выбрать в папке файл (любой)
curPtch=FileOpenDlg(curPtch,"" ,"tab","Выбор папки")
if curPtch ="" then
note "Папка не определена!"
exit sub
end if
curPtch=PathToDirectory$(curPtch)
SearchStr="*." 'только папки
'SearchStr="*.*" 'все файлы и папки
'SearchStr="\*" 'только файлы???
'SearchStr="*doma1*.*" 'все файлы doma1 с любым разрешением разрешением
'SearchStr="*.tab" 'только файлы с разрешением .tab
cont=true
k=0
'Поиск первого файла *.tab в папке curPtch:
'Манипулятор hSearch используется для продолжения поиска.
'Переменная WFD со структурой WIN32_FIND_DATA заполняется информацией
'о найденном файле и используется при продолжении поиска.
hSearch =FindFirstFile(curPtch & SearchStr ,WFD)
print ""
if hSearch <> INVALID_HANDLE_VALUE Then
do while cont
k=k+1
redim curFiles(k)
curFiles(k)=WFD.cFileName
'print "WFD.dwFileAttributes: "+ WFD.dwFileAttributes 'определяет папка(16) или файл(32)
print FILE_ATTRIBUTE_DIRECTORY
print "curPtch: "+ curPtch+"\"+curFiles(k)
print ""
'Функция ищет следующий файл.
'В случае удачи возвращает TRUE (<>0) или FALSE (=0) при неудаче.
cont=FindNextFile(hSearch,WFD)
loop
'Закрыть манипулятор.
cont=FindClose(hSearch)
else
note "Файлы *.tab в папке " & curPtch & " не найдены!"
exit sub
end if
end sub
'''''''''''''''''''''''''''''''''''''''''
Sub proc1
end sub
|
|
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Сен 11, 2013 3:49 pm Заголовок сообщения: |
|
|
Я проверял по-тупому:
If WFD.dwFileAttributes = 16 Then
' Работаем с каталогом WFD.cFileName
End If |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Сен 11, 2013 3:50 pm Заголовок сообщения: |
|
|
А так, там конечно битовая маска. Надо сначала на MapBasic написать функции работы с масками - xor, and и т.д. (или экспортировать их из какой-нибудь dll) и работать со значением как с маской. |
|
Вернуться к началу |
|
|
sysrepos
Зарегистрирован: 22.10.2012 Сообщения: 39
|
Добавлено: Чт Сен 12, 2013 9:40 am Заголовок сообщения: |
|
|
ясно, спасибо. |
|
Вернуться к началу |
|
|
|