Masowa zmiana nazw plikow w folderze i jego podfolderach

0

Masowa zmiana nazw plikow w folderze i jego podfolderach

Zastanawiam sie nad wykonaniem aplikacji umozliwiajacej masowa zmiane nazw plikow w folderze i jego podkatalogach.

np.

 KATALOG_GLOWNY
   w nim: 
            KATALOG_1
            KATALOG_AACCS
            KATALOG_212323
            plik.dat
            plik_tekst.dat

chodzi mi o to by z katalogu KATALOG_GLOWNY co w nim jest nazwy plikow zmienil np na
plik_1.dat plik_2.dat itd oraz w jego podkatalogach jesli wystepuja.

Cos podobnego jak ma masowa zmiana nazw plikow w programach typu irfan view czy tez freecommander itp.

Zastanawiam sie jak takie cos wykonac z tad pisze ten post w celu uzyskania podpowiedzi od WAS jak mozna to wykonac i gdzie szukac informacji na ten temat by przyblizyc sie do rozwiazania tego watku.

Z gory dziekuje za wszelkie informacje podpowiedzi .

0

podobny watek masz tu http://4programmers.net/Forum/44774?h=podfoldery#id44774

<ort>nie mniej </ort>jednak rozwiazan gotowych brak. Co do podpowiedzi nalezy zrobic sobie liste plikow w folderze i podfolderach by moc zaczac zabawe ze zmiana nazw plikow. Nastepnie po kolei je zamieniac na nazwe wg przyrostu od pierwszego do ostatniego. rozumiem jednak ze chodzi ci o zmiane nazw tak by w kazdym podkatalogu bylo to od 1 do ostatniego a nie na zasadzie ze all od 1 do ostatniego.

Zatem musisz wylistowac sobie podkatalogi z plikami zapisac sobie je i robic po <ort>kolei </ort>zmiane w nich

0

Moja podpowiedź w postaci kodu:

Tak sobie wylistujesz wszystkie pliki w folderach i subfolderach, resztę sobie już zrobisz sam za pomocą pętli i RenameFile. Pamiętaj, aby sprawdzić wcześniej czy wylistowane pliki nie są używane w danym momencie.

// Recursive procedure to build a list of files
procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string);
var
  SR: TSearchRec;
  DirList: TStringList;
  IsFound: Boolean;
  i: integer;
begin
  if StartDir[length(StartDir)] <> '\' then
    StartDir := StartDir + '\';

  { Build a list of the files in directory StartDir
     (not the directories!)                         }

  IsFound :=
    FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0;
  while IsFound do begin
    FilesList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);

  // Build a list of subdirectories
  DirList := TStringList.Create;
  IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0;
  while IsFound do begin
    if ((SR.Attr and faDirectory) <> 0) and
         (SR.Name[1] <> '.') then
      DirList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);

  // Scan the list of subdirectories
  for i := 0 to DirList.Count - 1 do
    FindFiles(FilesList, DirList[i], FileMask);

  DirList.Free;
end;


//PRZYCISK
procedure TForm1.Button1Click(Sender: TObject);
var
  FilesList: TStringList;
  fullFileName : string;
begin
  // Set up a full file name with drive and path
  fullFileName := Edit1.Text;
try
    FilesList := TStringList.Create;
    FindFiles(FilesList, {sciezka}ExtractFilePath(Edit1.Text), {nazwa pliku}Edit2.Text);
    ListBox1.Items.Assign(FilesList);
    Label1.Caption := IntToStr(FilesList.Count);
    finally
    FilesList.Free;
  end;
end;
0
Oskar_kurier napisał(a)

Moja podpowiedź w postaci kodu:

Tak sobie wylistujesz wszystkie pliki w folderach i subfolderach, resztę sobie już zrobisz sam za pomocą pętli i RenameFile. Pamiętaj, aby sprawdzić wcześniej czy wylistowane pliki nie są używane w danym momencie.

// Recursive procedure to build a list of files
procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string);
var
  SR: TSearchRec;
  DirList: TStringList;
  IsFound: Boolean;
  i: integer;
begin
  if StartDir[length(StartDir)] <> '\' then
    StartDir := StartDir + '\';

  { Build a list of the files in directory StartDir
     (not the directories!)                         }

  IsFound :=
    FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0;
  while IsFound do begin
    FilesList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);

  // Build a list of subdirectories
  DirList := TStringList.Create;
  IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0;
  while IsFound do begin
    if ((SR.Attr and faDirectory) <> 0) and
         (SR.Name[1] <> '.') then
      DirList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);

  // Scan the list of subdirectories
  for i := 0 to DirList.Count - 1 do
    FindFiles(FilesList, DirList[i], FileMask);

  DirList.Free;
end;





czy jak wpiszę ten kod to on bedzie działał automatycznie?Nie chciałbym robić tego "z łapy" .


//PRZYCISK
procedure TForm1.Button1Click(Sender: TObject);
var
  FilesList: TStringList;
  fullFileName : string;
begin
  // Set up a full file name with drive and path
  fullFileName := Edit1.Text;
try
    FilesList := TStringList.Create;
    FindFiles(FilesList, {sciezka}ExtractFilePath(Edit1.Text), {nazwa pliku}Edit2.Text);
    ListBox1.Items.Assign(FilesList);
    Label1.Caption := IntToStr(FilesList.Count);
    finally
    FilesList.Free;
  end;
end;
0

czy jak wpiszę ten kod to on bedzie działał automatycznie?Nie chciałbym robić tego "z łapy" .

Po pierwsze naucz się cytować, bo tak zacytowałeś, że Twoje pytanie "zlało się" z wklejonym przez poprzednika kodem. Nic nie zadziała samo z siebie. Najlepiej zastosuj kod jak należy to dowiesz się czy zadziała tak, jak chcesz. A jeżeli chcesz wyszukiwać pliki to ja korzystałem z modułu na: http://www.torry.net/vcl/filedrv/search/wdfindf.zip użytego dynamicznie i spełnił moje oczekiwania jako jedyny chyba dostępny na torry.net, mimo że stworzony jeszcze w czasach Delphi 3. Jeśli chcesz też zrobić masową zmianę nazw plików to mozna na liście znalezionych plików wydobyć ściezkę znalezionego pliku przez ExtractFilePath, a później podac ją jako drugi parametr funkcji opisanej na: RenameFile dodając do owego parametru również nową nazwę pliku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1