Avatar billede w13 Novice
18. august 2007 - 16:30 Der er 12 kommentarer og
1 løsning

Løbe filer i mappe igennem og tildele dem nye navne

Hej Eksperter.

Jeg har nu længe søgt på Google uden at finde svar.

Hvordan løber man alle filer i en mappe igennem og samtidig tildeler dem nye navne efter et bestemt mønster. Eks.: sommer-1.bmp, sommer-2.bmp, etc.

Håber I kan hjælpe mig. Gerne bare med et link!
Avatar billede hrc Mester
18. august 2007 - 18:09 #1
Du kan gå ud i en prompt og gøre det der. Stil dig i kataloget hvor dine filer ligger og skriv ren *.jpg sommer*.jpg

Den anden løsning er vha. FindFirst, FindNext, FindClose at pløje kataloget igennem.

procedure PrefixFileName(aPrefix : string);
var
  sr : TSearchRec;
  Found : boolean;
begin
  Found := FindFirst('*.jpg',fsAnyFile,sr) = 0;
  try
    while Found do
    begin
      // Kan ikke huske om delphis omdøbningsprocedure hedder det, jeg gætter.
      RenameFile(sr.name, aPrefix + sr.name);
      Found := FindNext(sr) = 0;
    end;
  finally
    FindClose(sr);
  end;
end;
Avatar billede hrc Mester
18. august 2007 - 18:10 #2
Måske, men det mener jeg ikke, indeholder sr.name den fulde streng. I så fald må du bruge ExtractFileName, ExtractFilePath osv.
Avatar billede hrc Mester
18. august 2007 - 23:27 #3
Dette her er testet (og jeg ramte vist meget godt med mit oprindelige gæt):

...

implementation

uses
  FileCtrl;

procedure TfrmMain.btnDoItClick(Sender: TObject);
var
  sr : TSearchRec;
  Found : boolean;
  OldDir : string;
begin
  GetDir(0,OldDir);
  ChDir(ExcludeTrailingPathDelimiter(eDirectory.Text));
  try
    Found := FindFirst('*.jpg',faAnyFile,sr) = 0;
    try
      while Found do
      begin
        RenameFile(sr.Name,ePrefix.Text + sr.Name);
        Found := FindNext(sr) = 0;
      end;
    finally
      FindClose(sr);
    end;
  finally
    ChDir(OldDir);
  end;
end;

procedure TfrmMain.btnLookupClick(Sender: TObject);
var
  st : string;
begin
  st := trim(eDirectory.Text);
  if SelectDirectory('Vælg katalog','\',st,[]) then
    eDirectory.Text := trim(st);
end;
Avatar billede w13 Novice
19. august 2007 - 13:57 #4
Ehm. Jeg er lidt ny i Delphi. Hvilke elementer skal jeg oprette på formen for at få det til at virke? Hvad skal jeg kalde dem?
Avatar billede hrc Mester
19. august 2007 - 14:29 #5
Du må gerne få mit testprogram hvis du har lyst. Skriv til hrc_public snabela hotmail... På min form har jeg to TEdit'er, eDirectory og ePrefix for hhv. kataloget hvor jpg'erne ligger og for hvad der skal stå foran filnavnet. Dernæst en knap, kaldet btnDOIt.
Avatar billede w13 Novice
19. august 2007 - 15:44 #6
Så har jeg rettet lidt, så navnene passer med mine indsatte elementer.

Denne linje gav fejlen "For mange aktuelle parametre":
  if SelectDirectory('Vælg mappe','\',st,[]) then Path.Caption:=trim(st);

Så jeg fjernede ",[]" og så kørte programmet uden fejl. Det omdøber dog ikke. Min kode er nu:
---------------------------------------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileCtrl, StdCtrls;

type
  TForm1 = class(TForm)
    Path: TLabel;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    ChooseFolder: TButton;
    Separator: TEdit;
    Label2: TLabel;
    Submit: TButton;
    procedure ChooseFolderClick(Sender: TObject);
    procedure SubmitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ChooseFolderClick(Sender: TObject);
var st: string;
begin
  st:=trim(Path.Caption);
  if SelectDirectory('Vælg mappe','\',st,[]) then Path.Caption:=trim(st);
end;

procedure TForm1.SubmitClick(Sender: TObject);
var
  sr: TSearchRec;
  Found: boolean;
  OldDir: string;
begin
  GetDir(0,OldDir);
  ChDir(ExcludeTrailingPathDelimiter(Path.Caption));
  try
    Found:=FindFirst('*.txt',faAnyFile,sr)=0;
    try
      while Found do begin
        RenameFile(sr.Name,Separator.Text+sr.Name);
        Found:=FindNext(sr)=0;
      end;
    finally
      FindClose(sr);
    end;
  finally
    ChDir(OldDir);
  end;
end;

end.
-----------------------------------------------------
Ja, jeg har ændret .jpg til .txt, da det lige er det jeg tester på. Jeg laver bagefter, så man kan vælge fileextension manuelt.
Avatar billede w13 Novice
19. august 2007 - 15:48 #7
Næh, det er bare mig, der er lidt for dum. Jeg skrev intet i Separator-feltet. :P
Avatar billede w13 Novice
19. august 2007 - 15:53 #8
Hvordan henter jeg så fileextension, altså enten txt eller jpg eller lign? sr.Extension findes jo ikke.
Avatar billede w13 Novice
19. august 2007 - 16:07 #9
Never mind. Fandt: ExtractFileExt(sr.Name)
Avatar billede w13 Novice
19. august 2007 - 16:58 #10
Hmmm. Den gør det også med mapper, kan man tjekke for det?
Avatar billede hrc Mester
19. august 2007 - 22:37 #11
God lille monolog du har kørende :-)
Avatar billede hrc Mester
19. august 2007 - 22:42 #12
Du kan gøre det to steder. Det rigtige sted er at rette faAnyFile til faArchive som kun tager "almindelige" filer. Det andet sted er at tjekke på sr.attr og se om det er et katalog eller en fil.
Avatar billede w13 Novice
20. august 2007 - 19:57 #13
Perfekt! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester