www.map-info.ru :: Просмотр темы - Список файлов в папке
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Sibit



Зарегистрирован: 10.12.2012
Сообщения: 10

СообщениеДобавлено: Вт Дек 11, 2012 4:57 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Да оно и без закрытия не работает. Я его уже потом добавил, думал что так лучше будет Smile Ну и если он не нужен, тогда совсем непонятно, в какой момент его использовать? если после поиска то последний FHandle будет 0. Хранить их в массиве и потом закрывать?

Ну и в целом, вроде все просто, но Мапинфо ломается, в чем может быть причина?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Вт Дек 11, 2012 7:34 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Покажите как вы объявили структуру WIN32_FIND_DATA
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
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?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Sibit



Зарегистрирован: 10.12.2012
Сообщения: 10

СообщениеДобавлено: Ср Дек 12, 2012 11:10 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

250

Такое чувство что проблема зависит от количества запусов функции поиска (FindNextFile). Если их немного , то все работает идеально. Если довольно много то мапинфо падает. Причем проблема именно с WinApi - сделал тоже самое без его использования - все нормально работает.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Ср Дек 12, 2012 3:19 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

А должно быть 260:
http://www.rsdn.ru/forum/winapi/214156.1

Проверьте с 260.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Sibit



Зарегистрирован: 10.12.2012
Сообщения: 10

СообщениеДобавлено: Чт Дек 13, 2012 5:51 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Вроде заработало Smile Спасибо!

Единственное что непонятно - в какой момент 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. Вы где-то ошиблись в отладке.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
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. В вашем случае - за рамками цикла.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HellSlinger



Зарегистрирован: 03.02.2013
Сообщения: 1

СообщениеДобавлено: Вс Фев 03, 2013 11:07 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Sibit, а Вы не могли бы поделиться полным вариантов кода чтения файлов .mif/.tab из каталога и из подкаталогов?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru