Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Sibit
Зарегистрирован: 10.12.2012 Сообщения: 10
|
Добавлено: Пн Дек 10, 2012 5:57 am Заголовок сообщения: Список файлов в папке |
|
|
Добрый день. Хочу получить список файлов в папке(Mapinfo 8.5). Пользуюсь следующими функциями
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" Alias "FindClose" (ByVal hFindFile As Integer) As Integer
Вот только проблема: иногда MapInfo падает, пишет что приложение не может прочитать память. Примеры брал из инета, раньше все работало(только файлов было мало).
Делаю примерно так :
FileHnd = FindFirstFile(FileFind,lpFindFileData)
if FileHnd > 0 then
FindMore=FileHnd
while FindMore > 0
fileName = lpFindFileData.cFileName
FindMore=FindNextFile(FileHnd,lpFindFileData)
retClose = FindClose(FindMore)
wend
end if
Такое чувство что какой-то ресурс не освобождается, но вот как правильно делать не понимаю. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пн Дек 10, 2012 7:20 pm Заголовок сообщения: |
|
|
А зачем вы закрывает хендл после первого FindNextFile? А если будет еще один виток цикла, а хендл у вас закрыт?
Как-то так:
Код: |
' Проход по файлам
FHandle = FindFirstFile(SourceDir+"*.mif", FData)
If FHandle <> -1 Then
Do
' Что-нибудь делаем с FData.cFileName
Loop While FindNextFile(FHandle, FData) = 1
FHandle = FindClose(FHandle)
End If
|
|
|
Вернуться к началу |
|
|
Sibit
Зарегистрирован: 10.12.2012 Сообщения: 10
|
Добавлено: Вт Дек 11, 2012 4:57 am Заголовок сообщения: |
|
|
Да оно и без закрытия не работает. Я его уже потом добавил, думал что так лучше будет Ну и если он не нужен, тогда совсем непонятно, в какой момент его использовать? если после поиска то последний FHandle будет 0. Хранить их в массиве и потом закрывать?
Ну и в целом, вроде все просто, но Мапинфо ломается, в чем может быть причина? |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Дек 11, 2012 7:34 pm Заголовок сообщения: |
|
|
Покажите как вы объявили структуру WIN32_FIND_DATA |
|
Вернуться к началу |
|
|
Sibit
Зарегистрирован: 10.12.2012 Сообщения: 10
|
Добавлено: Ср Дек 12, 2012 7:15 am Заголовок сообщения: |
|
|
Type WIN32_FIND_DATA
dwFileAttributes As Integer
ftCreationTime As Float
ftLastAccessTime As Float
ftLastWriteTime As Float
nFileSizeHigh As Integer
nFileSizeLow As Integer
dwReserved0 As Integer
dwReserved1 As Integer
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Ср Дек 12, 2012 9:36 am Заголовок сообщения: |
|
|
Константа MAX_PATH какое значение у вас имеет в MapBasic? |
|
Вернуться к началу |
|
|
Sibit
Зарегистрирован: 10.12.2012 Сообщения: 10
|
Добавлено: Ср Дек 12, 2012 11:10 am Заголовок сообщения: |
|
|
250
Такое чувство что проблема зависит от количества запусов функции поиска (FindNextFile). Если их немного , то все работает идеально. Если довольно много то мапинфо падает. Причем проблема именно с WinApi - сделал тоже самое без его использования - все нормально работает. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
|
Вернуться к началу |
|
|
Sibit
Зарегистрирован: 10.12.2012 Сообщения: 10
|
Добавлено: Чт Дек 13, 2012 5:51 am Заголовок сообщения: |
|
|
Вроде заработало Спасибо!
Единственное что непонятно - в какой момент FindClose вызывать надо? И надо ли вообще? Просто если перебор в цикле делать, то хендл будет 0 в его конце(по этому условию и заканчиваем цикл) и смысла вызывать FindClose(0) нет никакого. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пт Дек 14, 2012 6:54 pm Заголовок сообщения: |
|
|
Я же код привел. С чего вы взяли, что хендл будет равен 0 в конце? Хендл - это по сути указатель. Вы его выделили, вы его будьте добры и освободить. Система не знает о моменте, когда вам его надо освободить. Может вы обратно метнетесь по циклу при достижении конца? Никто не запрещает.
Вот определение функции:
Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Integer, lpFindFileData As WIN32_FIND_DATA) As Integer
Здесь hFindFile - ByVal, т.е. по значению. Оно не может превратить входной параметр в 0. Вы где-то ошиблись в отладке. |
|
Вернуться к началу |
|
|
Sibit
Зарегистрирован: 10.12.2012 Сообщения: 10
|
Добавлено: Пн Дек 17, 2012 10:31 am Заголовок сообщения: |
|
|
Собственно смутил ваш комментарий:
Андрей Могильный писал(а): |
А зачем вы закрывает хендл после первого FindNextFile? |
К коду:
Код: |
FileHnd = FindFirstFile(FileFind,lpFindFileData)
if FileHnd > 0 then
FindMore=FileHnd
while FindMore > 0
fileName = lpFindFileData.cFileName ' тут просто обработка полученного значения
FindMore=FindNextFile(FileHnd,lpFindFileData)
retClose = FindClose(FindMore)
wend
end if
|
Вроде бы структура lpFindFileData у нас заполнена, хендл можно смело закрывать. Единственное, что первый хендл не закрывается. Но код работает именно так как я ожидаю. Или я что-то не правильно понимаю? |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пн Дек 17, 2012 6:52 pm Заголовок сообщения: |
|
|
Вы неправильно понимаете конструкцию. Хендл возвращает FindFirstFile, в дальнейшем идет работа именно с этим хендлом, он не меняется при следующих вызовах FindNextFile.
Соответственно освобождать его (хендл) надо только когда мы поработали с ним и больше не предвидится по нему вызовов FindNextFile. В вашем случае - за рамками цикла. |
|
Вернуться к началу |
|
|
HellSlinger
Зарегистрирован: 03.02.2013 Сообщения: 1
|
Добавлено: Вс Фев 03, 2013 11:07 pm Заголовок сообщения: |
|
|
Sibit, а Вы не могли бы поделиться полным вариантов кода чтения файлов .mif/.tab из каталога и из подкаталогов? |
|
Вернуться к началу |
|
|
|