Какие модули/надстройки использовать

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Какие модули/надстройки использовать

Сообщение neon2ch » 25.11.2015 00:03:10

Здравствуйте. мне нужно написать такую программу:
1) Программа получает список файлов с расширением txt из папки (файлы имеют русские названия), подсчитывает их кол-во
2) Программа записывает названия файлов в массив с помощью цикла от 1 до кол-ва файлов в папке
3) Программа получает список файлов другой папки (расширение html), также их записывает в другой массив
4) Программа проверяет есть ли в каждом из html файлов название 1, 2, 3... последнего) txt файлов. Если название есть, то она заменяет совокупность символов html файла, которые соответствуют названию txt файла на содержимое txt файла (содержимое - кириллица)

Пожалуйста, расскажите, для начала, как сделать 1) то есть получить список файлов директории в Lazarus, используя какие uses и пакеты и.т.д.
Я искал в интернете, нашел много тем, но везде в тексте программы, которая получает имена файлов есть неизвестная лазарусу функция

Например, на этой странице viewtopic.php?f=5&p=41477 каждый пример не работает! Мой лазарус не знает OutExt и SysToUTF8, я добавил в uses SysUtils, Graph, но нет. Не работает.

Ну и если посоветуете с 1, то также посоветуйте, пожалуйста, функции, которые позволяют работать с русскими файлами в директории, а также читать русские символы из файла, писать русские символы в файл, функция, возвращающая кол-во строк файла, если такая есть;
строки из файла 1 в файл 2 никак не перенести легче, чем цикл с writeln'ами?
html файл он также откроет как текстовый? проблем не будет?

Прошу говорить, какие модули используются, а то я уже устал копировать с форумов текст и получать "Identefer not found"
Заранее спасибо!

Добавлено спустя 5 часов 31 минуту 52 секунды:
1 я начал делать,
Но столкнулся с трудностями с русскими символами.
Прошу помочь с переводом чтоб их лазарус понимал, записывал в строки, а потом эти строки записывал в файлы.
Вот допустим код.
Код: Выделить всё
uses
FileUtil, Dos;
Var
  s: SearchRec;
  MassivNameTxt: array [1..400000] of string;
  koltxt: integer;
BEGIN
FindFirst('c:familiya*.txt',AnyFile,s);
koltxt:=0;
While DosError=0 do
begin
  inc(koltxt);
  With s do begin
  MassivNameTxt[koltxt]:=(Name);
  (Writeln(MassivNameTxt[koltxt]:12, Size:12));
  end;
  FindNext(s);
end;
writeln('txt:',koltxt:12);
Readln;     
end.

Сейчас он выдает кракозябры
Посмотрел здесь функции, попробовал заменить FindFirst на FindFirstUTF8, но выдает еррор Error: Call by var for arg no. 3 has to match exactly: Got "Searchrec" expected "TSearchRec". Посмотрел вроде бы выходные и входные данныеу функций UTF8FindFirst и у FindFirst одинаковые. Странно. Еще пишет, что-то про winfileutil.

Как сделать, чтоб MassivNameTxt[1]

Добавлено спустя 8 минут 3 секунды:
Как сделать чтоб Massiv'ы и вообще строки могли быть сначала прочитаны в UTF8,
потом записаны в UTF8 и все операции могли быть сделаны в UTF8. Нашел кучу функций, являющихся альтернативами обычных
http://wiki.freepascal.org/fileutil
Их просто нужно использовать вместо обычных? Но почему тогда не работает Utf8FindFirst?
Прописал путь для папки winfileuntil в настройках компилятора.
Теперь сообщение перекидывает в модуль показывая функцию
Код: Выделить всё
function FindFirstUTF8(const Path: string; Attr: Longint; out Rslt: TSearchRec): Longint;
begin
  Result:=FindFirst_(Path, Attr, Rslt);
end;   

Но у обычного FindFirst всё также! Так почему он работает, а эта функция не работает? 3 тип данных такой же в функциях, но FindFirstUTF8 говорит, что ей нужен TSearchRec

Добавлено спустя 11 минут 28 секунд:
Хех, этот тред потихоньку превращается в мой монолог :-)
(надеюсь на форуме это не запрещено :) )
В общем, еще погуглив я понял, что findfirst работает как с searchrec, так и с tsearchrec, а utf8findsearch только с tsearchrec модуля sysutils.
Подключил модуль sysutils и заработало. Буду держать вас в курсе событий :)
neon2ch
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2015 23:10:30

Re: Какие модули/надстройки использовать

Сообщение Лекс Айрин » 25.11.2015 09:46:08

Судя по всему, это будет консольное приложение?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Какие модули/надстройки использовать

Сообщение neon2ch » 25.11.2015 10:51:08

Я не помню что нажимал при создании :) (мало знаком с лазарусом, вдруг это что-то меняет). Ну по своей сути это консольное приложение.
P.S. застрял на том, как записывать файлы. Строка в 255 слишком маленькая, решил попробовать antistring.
Но antistring, хоть и хранит всю нужную информацию, и даже выводит ее в консоль, но в файл отдает только 256*z, где z - целое символов. То есть символы, после ближайшего предыдущего 256*z отбрасываются.
Видимо придется копировать строки посимвольно. Ну хорошо хоть строка в памяти остается, а значит найти вхождение строки 1 в строку 2 будет легко. А вот как вставить строки из 1 файла во 2 после того как программа найдет что и куда вставлять - я еще не разобрался.
neon2ch
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2015 23:10:30

Re: Какие модули/надстройки использовать

Сообщение Лекс Айрин » 25.11.2015 11:26:04

neon2ch, дело в том, что для Лазаруса и FPC поддержка юникода это разные модули. Читали эту статью? http://www.freepascal.ru/article/freepa ... 718142000/

neon2ch писал(а):Но antistring, хоть и хранит всю нужную информацию, и даже выводит ее в консоль, но в файл отдает только 256*z, где z - целое символов. То есть символы, после ближайшего предыдущего 256*z отбрасываются.


А как определен файл? Вообще-то текстовая строка должна записываться в режиме потока данных, а у вас тут получается блочная запись.

neon2ch писал(а):А вот как вставить строки из 1 файла во 2 после того как программа найдет что и куда вставлять - я еще не разобрался.


через временную текстовую переменную.Примерно так
Код: Выделить всё
var
TextTmp:UnicodeString;
File1, File2: textfile;//здесь могу ошибаться...
Begin
Assign (file1, 'input.txt');
Assign (file2, 'output.txt');
Readln (File1,TextTmp);
Writeln (File2? TextTmp);
End.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Какие модули/надстройки использовать

Сообщение resident » 25.11.2015 12:37:18

http://listingimg.s3.amazonaws.com/neon2ch.zip
Если заинтересует такой вариант, то цена 500 рублей

з.ы. У меня Windows 8.1 / Lazarus 1.2.6
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Какие модули/надстройки использовать

Сообщение neitent » 25.11.2015 15:57:28

Ваша ошибка - в невнимательности
Var
s: SearchRec; <-- THIS. название типа неверное, замените на корректное TSearchrec

FindFirst('c:familiya*.txt',AnyFile,s); <- а вот тут потерялся бэкслэш,
Аватара пользователя
neitent
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2015 18:38:27

Re: Какие модули/надстройки использовать

Сообщение neon2ch » 26.11.2015 21:07:01

Лекс Айрин писал(а):А как определен файл? Вообще-то текстовая строка должна записываться в режиме потока данных, а у вас тут получается блочная запись.

Переменная была text, просто закрытие файла не обрабатывалось (close)
Лекс Айрин писал(а):дело в том, что для Лазаруса и FPC поддержка юникода это разные модули. Читали эту статью?

Лекс Айрин, Огромное спасибо за ссылку! Благодаря этой статье получилось всё как надо :)) Премного благодарен!
resident, спасибо, конечно, но я уже сам всё сделал=)
neitent, да уже нашёл)
Всем спасибо!
neon2ch
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.11.2015 23:10:30


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 264

Рейтинг@Mail.ru