Страница 1 из 1

Копирование списка / перенос папок

СообщениеДобавлено: 30.10.2015 12:46:15
programister
Здравствуйте.

Вопрос сводится к:
1) какие функции нужны, в каких библиотеках искать и как библиотеки подключать
2) синтаксис вызова внешней подпрограммы (*.ехе) с параметрами (*.exe, "...params...")
либо ("cmd.exe > ...~params...")

Задача: создать консольную прогу, которая:
Т.З. псевдокодом:

var
v_fname:string;
v_f:TTextFile;

begin
v_fname:=dirList.txt

1) If NOT FileExist (v_fname)
then читает список папок текущей директории
сохраняет в (v_fname)
2) else while not EOF (v_fname) //if fileExist(v_fname)
foreach readLine(v_fname, v_dirName) do
begin if not DirExist(v_dirName) mkdir (v_dirName).
end.

Пробую прописать
uses FileUtils; // - выдает ошибку.

Альтернативно - как вставить в Лазарусе код обращений к cmd ?
Наподобие
FnctCallCMD(v_commandLine:record of strings, v_output ):boolean;
FnctCallCMD(v_commandLine:string ):boolean;

Чтобы потом (копирование списка в файл)
x:record of strings;
FnctCallCMD(v_command, x);
FileWrite(v_fname, x);

или (развертывание списка из файла в папки)
foreach v_fname as record do
If not fileExist( record){
If not FnctCallCMD("mk dir", record){
break;}
}

Ну в крайнем случае, скажите, что на Code:Blocks (C, C++) будет легче :(

Есть ли в Лазарусе браузер объектов (имена переменных, функций, классов) - чтобы можно было переименовывать без Find/Replace.

С уважением.

Re: Копирование списка / перенос папок

СообщениеДобавлено: 30.10.2015 15:34:23
Mikhail
programister писал(а):Вопрос сводится к: 1) какие функции нужны, в каких библиотеках искать и как библиотеки подключать2) синтаксис вызова внешней подпрограммы (*.ехе) с параметрами (*.exe, "...params...") либо ("cmd.exe > ...~params...")

Как-то сумбурно, можно по подробнее о задаче?

Re: Копирование списка / перенос папок

СообщениеДобавлено: 30.10.2015 15:50:18
Лекс Айрин
Mikhail, видимо, ему нужно создать файловый менеджер.

Re: Копирование списка / перенос папок

СообщениеДобавлено: 30.10.2015 21:01:36
stanilar
Больше похоже на то, что человек решил освоить паскаль после скриптового языка.

programister писал(а):как вставить в Лазарусе код обращений к cmd

Например так: http://wiki.freepascal.org/Executing_External_Programs/ru

Re: Копирование списка / перенос папок

СообщениеДобавлено: 01.11.2015 01:08:12
programister
Здравствуйте!
Рад скорому отклику.
stanilar, ссылка - супер!!! Да, PHP, JS. Кодировал лабораторки на Делфи 7 - 6 лет назад. Сейчас почти с нуля начинаю.

А пока хоть мат-часть выучить: директивы компилятора, библиотеки, синтаксис подключения файла(ов) с ресурсами....
ООП подучить...


Надо: скопировать / создать структуру / дерево папок без файлов
В идеале - с заданным уровнем глубины.

Думал упростить задачу кодинга разделив на 2:
1) Скопировать в файл ( прочитать имя каждой следующей папки.)
2) Создать по списку из файла ( прочитать каждую стороку, если такой папки нет - создать)

Поведение проги:
Пуск
если файл_список.txt не существует - создать файл_список.txt
иначе создать директории соответственно файл_список.txt

Застопорился на последовательном считывании директорий.
Варианты:
1) ~GetDirList () //из библиотеки - какой?
2) ~GetFileList() + проверка - если файл директория => включить в список.

Потом уже вспомню обработку списков и массивов циклами, создание директорий....

Буду признателен-с.

Re: Копирование списка / перенос папок

СообщениеДобавлено: 02.11.2015 09:20:04
Mikhail
programister писал(а):Застопорился на последовательном считывании директорий.


Модуль SysUtils, подпрограммы: FindFirst, FindNext, FindClose.

Re: Копирование списка / перенос папок

СообщениеДобавлено: 05.11.2015 13:46:54
programister
Весьма признателен!!



Пробую - копирую код из "help" в проект.
Выдает ошибки.
В начале пришлось
v_Info : TSearchRec; -> v_Info : SearchRec;
осталось 2 ошибки по несовместимости типов.
варианты:
1) Директива о неявном приведении типов,
2) какие типы правильно выставить?


Код: Выделить всё
program dirList_my;
uses lazutils, sysutils, iostream, dos, strings, fileutil;

{$inline on}
Const CDrive : Byte = 3;

Var
  v_AddrStringInt,
  v_AddrRecordInt  :integer;
  v_AddrRecord, v_listOfDirObj, v_ListOfDirs: Array of String;
  v_CurrDir:string;
   v_Count: integer;
   v_Info : SearchRec;
   //listArr : TStringList;




Begin

//stdcall;
v_CurrDir:=GetCurrentDir;
// writeln ('Length of adress string = '+IntToStr(Length(v_CurrDir)));
writeLn ('Current Directory is : ');writeln(v_CurrDir);
v_Count:=0;

If FindFirst ( // <<1---
               '*',
               faDirectory,
               v_Info)=0 then
   begin
   Repeat
     Inc(v_Count);
     With v_Info do
       begin
       If (Attr and faDirectory) = faDirectory then
         Write('Dir : ');
       Writeln (Name:40,Size:15);
       end;
   Until FindNext(v_Info)<>0; // <<2---
   end;
FindClose(v_Info);
Writeln ('Finished search. Found ',
           v_Count,
           ' matches');
readln;
End.   







Компиляция проекта, цель: dirList_my.exe: Код завершения 1, ошибок: 2, подсказок: 1
dirList_my.lpr(30,22) Hint: Variable "v_Info" does not seem to be initialized
dirList_my.lpr(27,5) Error: Incompatible types: got "untyped" expected "LongInt" //<< 1----
dirList_my.lpr(40,10) Error: Incompatible types: got "untyped" expected "LongInt"//<< 2----

Добавлено спустя 25 минут 10 секунд:
Причем, если скопировать код "начисто" из "help" - всё работает.
Чем я помешал?

Re: Копирование списка / перенос папок

СообщениеДобавлено: 05.11.2015 14:55:09
Mikhail
Список подкаталогов текущего каталога
Код: Выделить всё
{$mode objfpc}{$H+}
program project1;
uses sysutils;

var v_CurrDir:string;
    v_Count: integer;
    v_Info : TSearchRec;

begin
v_CurrDir:=GetCurrentDir;
writeln ('Current Directory is : ', v_CurrDir);
v_Count:=0;

if FindFirst (v_CurrDir, faDirectory, v_Info) = 0 then begin
  try
   repeat
    if v_Info.Attr = faDirectory then
     writeln(v_Info.Name:16);

    inc(v_Count);
   until FindNext(v_Info) <> 0;
  finally
   FindClose(v_Info);
  end;
end;{if}

writeln ('Finished search. Found ',
           v_Count, ' matches');
readln;
end.