Массовое переименование файлов

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by aydar, 7 Jun 2012.

  1. aydar

    aydar Member

    Joined:
    12 Nov 2009
    Messages:
    259
    Likes Received:
    6
    Reputations:
    -2
    Ребят, выбираю папку где есть фото названия все разные, надо их переименовать по порядку 1.jpg 2.jpg и тд.

    Получаем кол-во файлов в папке

    Переименовываем

    Вроде меняет, но все ни так, например в папке 35 фото, он меняет 34, 35 нету вместо него 36, смотришь кол-во фото в папке их уже 36, хз где еще 1 фотка, когда-то вообще удаляет файлы, у друга 2 файла появляется, но их физ нету
     
    #1 aydar, 7 Jun 2012
    Last edited: 7 Jun 2012
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    aydar, ты не забывай, что в папке могут находиться скрытые системные файлы Desktop.ini и Thumbs.db, отсюда, возможно и скачет твой счетчик, ну и расширение файла ты не учитываешь.
    я б как-то так сделал:
    Code:
    // dir - должна заканчиваться "\"
    procedure _ReName(const dir: String);
    var
      oldName, ext: String;
      lpFindFileData: TWIN32FindData;
      hFind: THandle;
      iCount: Integer;
    begin
      iCount:= 0;
      hFind:= FindFirstFile(PChar(dir + '*.*'), lpFindFileData);
    
      if (hFind <> INVALID_HANDLE_VALUE) then try
    
      while True do begin
    
        // если папка либо скрытый файл - пропускаем
        if ((lpFindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) or
           ((lpFindFileData.dwFileAttributes and FILE_ATTRIBUTE_HIDDEN) <> 0) then begin
    
          if FindNextFile(hFind, lpFindFileData) then continue
            else if (GetLastError = ERROR_NO_MORE_FILES) then Break;
        end else begin
          oldName:= dir + PChar(@lpFindFileData.cFileName);
          ext:= ExtractFileExt(oldName);
          RenameFile(oldName, dir + IntToStr(iCount) + ext);
          Inc(iCount);
          if not FindNextFile(hFind, lpFindFileData) then Break;
        end;
      end;
      finally
        Windows.FindClose(hFind);
      end;
    end;
    
     
    1 person likes this.