Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Обрабатывать каждый файл в папке Delphi XE


Автор: Campus2000 23.5.2018, 23:24
Как, в данный кусок кода, добавить возможность: обрабатывать не один файл, а все файлы что находятся в папке и подпапках. Сейчас обрабатывает только один файл. Друзья - Помогите решить задачу!

Код

var
    SynArr: Array of Array of String;
      VocFile,SrcFile,DstFile: TextFile;
      TxtLine: String;
      SynList: TStringList;
    begin
     AssignFile(VocFile, OpenDialog2.FileName);
     Reset(VocFile);
     SetLength(SynArr, 0);
     SynList := TStringList.Create;
     while not Eof(VocFile)
     do begin
        ReadLn(VocFile, TxtLine);
        SynList.Text := StringReplace(WrapText(TxtLine,#13#10,['|'],1),'|','',[rfReplaceAll]);
        SetLength(SynArr, Length(SynArr)+1);
        SetLength(SynArr[High(SynArr)],SynList.Count);
        for i := 0 to SynList.Count - 1
        do SynArr[High(SynArr),i] := SynList.Strings[i];
        end;
     SynList.Free;
     CloseFile(VocFile);
 
     AssignFile(SrcFile, OpenDialog3.FileName);
     Reset(SrcFile);
 
     AssignFile(DstFile, OpenDialog4.FileName);
     Rewrite(DstFile);
     while not Eof(SrcFile)
     do begin
        ReadLn(SrcFile, TxtLine);
        for i := 0 to High(SynArr)
        do for j := 0 to High(SynArr[i])
           do TxtLine := StringReplace(TxtLine,SynArr[i,j],SynArr[i,Random(High(SynArr[i]))+1],[]);
        WriteLn(DstFile, TxtLine);
        end;
     CloseFile(DstFile);
     CloseFile(Srcfile);
    end;

Автор: Snowy 24.5.2018, 13:45
Поиск файлов:
Код
type
  TSearchCallback = function (path: String; isDir: boolean): boolean;
  
procedure ScanDirs(Dir: String; Mask: String; List: TStrings; callback: TSearchCallback = nil);
  procedure ScanDir(Dir: String; Mask: String; List: TStrings; callback: TSearchCallback);
  var sr: TSearchRec;
  begin
    if FindFirst(Dir + Mask, faAnyFile, sr) = 0 then
    begin
      repeat
        if (sr.Attr and faDirectory) <> faDirectory then
        begin
          if Assigned(List) then List.Add(Dir + sr.Name);
          if Assigned(callback) then callback(Dir + sr.Name, false);          
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
  end;
var
  sr: TSearchRec;
begin
  if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
  if FindFirst(Dir + '*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      if (sr.Attr and faDirectory) = faDirectory then
      begin
        if (sr.Name<>'.') and (sr.Name<>'..') then
        begin
          ScanDirs(Dir + sr.Name, Mask, List, callback);
          if Assigned(callback) then
            if callback(Dir+sr.Name, true) then break;
        end;
      end else ScanDir(Dir, Mask, List, callback);
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
end;


Тест1:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  i:  integer;
begin
  sl := TStringList.Create; // сюда складывается список файлов
  ScanDirs('D:\', '*.txt', sl); // сканируем каталоги
  for i := 0 to sl.Count - 1 do // начинаем работать по списку
  begin

  end;
end;


Тест2 с колбэком:
Код

function MyCallBack(Name: String; isDir: boolean): boolean;
begin
  Form1.Caption := Name; // путь к файлу/папке
  Application.ProcessMessages;
  Sleep(0);
  if not isDir then // если не папка
  try
    Form1.Memo1.Lines.LoadFromFile(Name); // что-то делаем с файлом
  except on E: Exception do
    Form1.Memo1.Lines.Text := E.Message; // если ошибка доступа к файлу
  end;
  result := false; // остановить сканирование?
end;    

procedure TForm1.Button2Click(Sender: TObject);
begin
  ScanDirs('D:\', '*.txt', nil, MyCallBack); // запуск
end;


Первый вариант сначала собирает список файлов, потом запускает обработку.
Второй вариант обрабатывает файлы по мере сканирования (аля антивирус).

Оформи свой код, как процедуру и вызывай с параметром имени файла.
Только сначала разберись в коде - хрень какая-то.
Куча ненужных действий и кривой рандом, уменьшающий вероятность на 1/n с каждой следующей строкой (вероятность выбора 1-й строки вдвое выше всех остальных строк вместе взятых, а у последней стремится к нулю)

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