Что нового

Чтение файлов из нескольких папок

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Здравствуйте господа.
Натолкните на мысль. В нескольких папках лежат текстовые файлы, в каждом файле одна строка, как собрать из нескольких *.txt всё в один файл.
Структура папок такая:
[основная папка]
[1]
[1]
[2]
[3]
[4]
[2]
[1]
[2]

[3]
[1]
[2]
количество вложенных папок разное, но глубина всегда равна трем.
с чтением и записью в файл разберусь, а вот как выбрать все файлы во всех папках затрудняюсь.
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Код:
#include <Array.au3> 
#include <File.au3>

Global $Folder = @ScriptDir & '\Информация БКИ' ; путь к папке
Global $Mask = "*.txt" ; маска файлов
Global $Files = _FileListToArrayRec($Folder, $Mask, 1, 1, 0, 2)
If @error Then Exit

For $i=1 To UBound($Files) -1
$FileOpen = FileOpen (@ScriptDir & "\otcet_bki.txt", 1)
$FileRead = FileReadLine ($Files, 1)
$FileWrite = FileWriteLine ($FileOpen, $FileRead & @CRLF)
FileClose ($FileOpen)
Next


выдает ошибку ERROR: _FileListToArrayRec(): undefined function.
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
обновил до последней версии, но видно где то накосячил. Заработало, но файл получается с пустыми строками, без данных


Добавлено:
Сообщение автоматически объединено:

разобрался, спасибо.
Код:
#include <Array.au3>
#include <File.au3>

Global $Folder = @ScriptDir & '\Информация БКИ' ; путь к папке
Global $Mask = "*.txt" ; маска файлов
Global $Files = _FileListToArrayRec($Folder, $Mask, 1, 1, 0, 2)
If @error Then Exit

For $i=1 To UBound($Files) -1
$FileOpen = FileOpen (@ScriptDir & "\otcet_bki.txt", 1)
$FileRead = FileRead ($Files  [$i])
$FileWrite = FileWriteLine ($FileOpen, $FileRead)
FileClose ($FileOpen)
Next
 
A

Alofa

Гость
Наверно вы хотели написать так:
Код:
#include <File.au3>

Global $Folder = @ScriptDir & '\Информация БКИ' ; путь к папке
Global $Mask = "*.txt" ; маска файлов
Global $FileRead, $Files = _FileListToArrayRec($Folder, $Mask, 1, 1, 0, 2)
If @error Then Exit

For $i=1 To $Files[0]
   $FileRead &= FileRead ($Files[$i]) & @CRLF
Next

FileWrite(@ScriptDir & "\otcet_bki.txt", $FileRead)
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Можете объяснить в чем разница?
Код:
For $i=1 To $Files[0]

Код:
For $i=1 To UBound($Files) -1


_FileListToArrayRec вроде же возвращает массив

как я понимаю ч-з UBound я считываю этот массив и записываю в файл.

*или я совсем ничего не понимаю :shok:
 
A

Alofa

Гость
Встречный вопрос. Первый элемент любого массива имеет индекс "0", какая причина подвигла вас начинать цикл "For" с индекса "1"?

ZeVSalt сказал(а):
... как я понимаю ч-з UBound я считываю этот массив и записываю в файл.
Неправильно понимаете. Посмотрите описание этой функции.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Alofa
Правильнее всё же проверять через Ubound (хотя бы как грамотную практику), это предотвратит падение скрипта в некоторых случаях.
См. Как предотвратить критические ошибки скрипта? в НЕофициальный FAQ AutoIt.

_FileListToArrayRec может вернуть и вовсе не массив, а пустую строку в случае ошибки (например, если файл не найден), и тогда при обращений к $Files[0] скрипт завершит свою работу с ошибкой.
 
A

Alofa

Гость
OffTopic:
CreatoR сказал(а):
... и тогда при обращений к $Files[0] скрипт завершит свою работу с ошибкой.
Вот на этот случай всегда стараюсь применять проверки на подобии, как в данном скрипте:
Код:
If @error Then Exit


CreatoR сказал(а):
Правильнее всё же проверять через Ubound (хотя бы как грамотную практику)
Я всегда за грамотность :smile:
Спасибо CreatoR - пойду почитаю.
 
Верх