Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Kopírování adresáře s vybranými soubory - Delphi

Zdravím Vás při zamračeném státním svátku :-)

Zase se trochu snažím programovat, akorát mi nejde zprovoznit jedna myšlenka. Chci mít funkci na kopírování adresáře s tím, že pokud bude hodnota "posledniverze" nastavena na true, tak to bude z adresáře kopírovat jen soubory s nejvyšší příponou. Abych to vysvětlil, jeden program mi při uložení nepřepíše původní soubory, ale vytvoří nové. Celkem dobrá vlastnost když se člověk splete a uloží :) . Takže adresář pak vypadá třeba takto:

souborA.1
souborA.2
souborA.3
souborA.4
souborA.5
souborB.1
souborB.2
souborB.3
souborC.125
souborC.126

No a jelikož při spoustě situací není potřeba staré soubory kopírovat, tak bych potřeboval nějak udělat, aby se zkopírovala od každého souboru jen verze s nejvyšším číslem, takže

souborA.5
souborB.3
souborC.126

V současné době používám toto na kopírování celých adresářů

function CopyDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc  := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom  := PChar(fromDir + #0);
    pTo    := PChar(toDir)
  end;
  Result := (0 = ShFileOperation(fos));
end;

jenže na to moje kopírování bych to viděl tak, že se načtou všechny soubory z adresáře, nějak se setříděj do seznamu, ze seznamu se vyhoděj staré verze a pak se ten seznam pošle do kopírovací funkce jednotlivých souborů. A teď jak na to. Potřebuji nakopnout :-[ kde začít, už to na mě začíná být vyšší dívčí.

Předmět Autor Datum
Neviem poradiť najefektívnejší postup, ale nejak tak, ako píšeš... :-) Ak som pochopil správne - me…
pme 28.09.2012 16:34
pme
Netuším akú verziu Delphi máš...:-/, ale od DELPHI XE2 pribudla trieda TDictionary... príklad: uni… poslední
pme 28.09.2012 18:12
pme

Neviem poradiť najefektívnejší postup, ale nejak tak, ako píšeš... :-)

Ak som pochopil správne - meniť sa bude iba prípona...
Zrejme to nebude "najlepší" spôsob, ale napadá ma narýchlo len toto:

0. Vytvoriť možno TStringList - kvôli triedeniu
1. Načítavať postupne všetky súbory z adresára FindFirst..., FindNext a testovať či sa názov súboru už v zozname nachádza a akú má príponu
2. Ak sa nenachádza - pridáš novú položku (názov súboru), ak áno - porovnáš príponu a potom buď nahradíš položku v zozname novším názvom, alebo ideš ďalej.
3. Následne vytvorený zoznam prechádzaš od začiatku do konca a kopíruješ...

Kód Ti sem písať nejdem, (nemám teraz čas), ak niečo nebudeš vedieť ozvi sa, večer sa na to môžem pozrieť - pomôcť...

Netuším akú verziu Delphi máš...:-/, ale od DELPHI XE2 pribudla trieda TDictionary...

príklad:

unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Generics.Collections;

type
  TForm5 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    IPList : TDictionary<string, string>;
    procedure AddItemToList(nazov, pripona: String);
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.AddItemToList(nazov, pripona: String);
var
  S: String;
begin
  if IPList.TryGetValue(nazov, S) then
  begin
    if StrToInt(pripona) > StrToInt(S) then
    begin
     IPList.Remove(nazov);
     IPList.Add(nazov, pripona);
    end;
  end else
  IPList.Add(nazov, pripona);
end;

procedure TForm5.Button1Click(Sender: TObject);
var
   Key: String;
begin
  // vypísať zoznam súborov s príponou
   for Key in IPList.Keys do
     ListBox1.Items.Add(Key+'.'+IPList.Items[Key]);

  //prípadne si prechádzaj zoznam a použi CopyFile...
end;

procedure TForm5.FormCreate(Sender: TObject);
var
  searchResult : TSearchRec;
begin
  // vytvoriť inštanciu TDictionary
  IPList := TDictionary<string, string>.Create;
  // načítavať názvy súborov + príponu a pridávať do zoznamu
  if FindFirst('*.*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      with searchresult do
       AddItemToList(ChangeFileExt(ExtractFileName(Name), ''), ExtractFileExt(name));
    until FindNext(searchResult) <> 0;
    FindClose(searchResult);
  end;
end;

procedure TForm5.FormDestroy(Sender: TObject);
begin
  // uvoľniť inštanciu dictionary
  IPList.Free;
end;

end.

Zpět do poradny Odpovědět na původní otázku Nahoru