Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual Basic: Общие вопросы > Обработка файлов в директории


Автор: Димон Безпарольный 02.07.18, 16:55
Написал нехитрый код перебора всех файлов в директории:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        Do While Len(tmp) > 0
            tmp = Dir()
            TMP1 = "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\" + tmp
            'TMP1 = "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h"
            Okno1.Text = Okno1.Text & TMP1 & vbCrLf
            Okno1.Text = Okno1.Text & "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h" & vbCrLf
            Open TMP1 For Input As #1
            Close
            CNT = CNT + 1
        Loop


Перебор файлов работает. Файлы в окне отображаются. Но при попытке открыть файл с заданием пути:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
            TMP1 = "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\" + tmp

Приводит к остановке выполнения с кодом "путь не найден". Если задавать непосредственно:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
            TMP1 = "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h"


То открытие происходит нормально. Хотя оба пути выдают в окне одинаковый результат:

Цитата

D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h
D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h


Код вывода в окно:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
            Okno1.Text = Okno1.Text & TMP1 & vbCrLf
            Okno1.Text = Okno1.Text & "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h" & vbCrLf


Помогите понять - где ж грабли, а то я закипел.

Спасибо.

Автор: Akina 02.07.18, 17:03
Цитата Димон Безпарольный @
оба пути выдают в окне одинаковый результат

Окну доверия - ноль. Получи их в двух переменных и сравнивай по одному символу. Ну и длину сравни.

Автор: Димон Безпарольный 03.07.18, 05:42
Вопрос решился. Добавил в цикл:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
            If Len(tmp) = 0 Then Exit Do


Хотя в цикле прописано условие:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Do While Len(tmp) > 0


Но каким - то образом в tmp = Dir() все таки попадает строка нулевой длины.

Автор: Akina 03.07.18, 06:32
Цитата Димон Безпарольный @
каким - то образом в tmp = Dir() все таки попадает строка нулевой длины

Потому что после присвоения строки нулевой длины отработает весь цикл, и только потом выполнится проверка. Правильный код должен быть, например, таким:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        tmp = Dir("*.h") ' Первое присвоение
        Do While Len(tmp) > 0 ' Проверка непосредственно после присвоения
            TMP1 = "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\" + tmp
            'TMP1 = "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h"
            Okno1.Text = Okno1.Text & TMP1 & vbCrLf
            Okno1.Text = Okno1.Text & "D:\8051\SAM7s\LCD_ILI9341_28_Font2\Fonts_ENG\01_Обычный\Fonts_@Microsoft_YaHei.h" & vbCrLf
            Open TMP1 For Input As #1
            Close
            CNT = CNT + 1
            tmp = Dir() ' Следующее присвоение
        Loop


Добавлено
Хотя имхо разумнее выполнять перебор через FSO в цикле ForEach.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)