Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   переименование файлов (http://forum.oszone.net/showthread.php?t=30492)

mask 03-04-2003 00:53 208852

Есть программа, к-ая на задоном диске, по заданному пути переименовывает файлы по маске *.[] в *.[]

#include <stdio.h>
#include <dos.h>
#include <dir.h>
#include <stdlib.h>
#include <direct.h>

main()
{
      char sf; int d;
      char dir[MAXPATH];

      printf("Please, input the name of drive (‘,D,E,F etc.) : ");
      scanf("%c", &sf);
      if(sf=='C' || sf=='c') d=2;
      if(sf=='D' || sf=='d') d=3;
      if(sf=='E' || sf=='e') d=4;
      if(sf=='F' || sf=='f') d=5;
      int disk = setdisk(d);
      disk = getdisk() + 'A';
      printf("The current drive is: %c\n", disk);
      _chdrive(d+1);

      printf("Input path: ");
      gets(dir);      /* Почему-то компилятор игнорирует эту строку и пропускает ее, почему? и как исправить*/
      chdir(dir);

      struct find_t ffblk;
      int done;
      printf("Directory listing of \%s\n", dir);
      done = _dos_findfirst("*.*",_A_NORMAL,&ffblk);
      while (!done)
      {
    printf("  %s\n", ffblk.name);
    done = _dos_findnext(&ffblk);
      }
     
      char oldname[80], newname[80];

      /* prompt for file to rename and new name */
      printf("File to rename: ");
      gets(oldname);
      printf("New name: ");
      gets(newname);

      /* Rename the file */
      if (rename(oldname, newname) == 0)
 printf("Renamed %s to %s.\n", oldname, newname);
      else
  perror("rename");

return 0;
}

Как сделать так что при указании ключа /s происходили поиск и переименование в поддирректориях?

Vaulter 03-04-2003 06:16 208853

вопервых, функцию поиска в заданой папке вынеси отдельно.
скажем
int SearchInDir(LPSTR path)

далее, findfirst findnext ами нужно искать также и папки, и для каждой папки рекурсивно вызывать нашу функцию.

mask 08-04-2003 00:56 208854

Как ввести ключ /s ?

shurikan 09-04-2003 13:05 208855

Vaulter
Цитата:

вопервых, функцию поиска в заданой папке вынеси отдельно.
скажем
int SearchInDir(LPSTR path)
Во-первых он ничего не ищет, а просто распечатывает содержимое папки. Потом ручками вводит старое и новое имя.

mask
Цитата:

Как ввести ключ /s ?
Куда ввести? И зачем?

Цитата:

int disk = setdisk(d);
* * *disk = getdisk() + 'A';
* * *printf("The current drive is: %c\n", disk);
* * *_chdrive(d+1);
Здесь первая и последняя строки, зачем это?


[s]Исправлено: shurikan, 13:07 9-04-2003[/s]

mask 09-04-2003 15:45 208856

Ключ /s для того, чтобы переименовывал в поддиректориях, вводится как параметр к exe-шнику.
В первой строке присваиваем переменной номер диска, а в последней происходит смена на этот диск.

glassMonk 11-04-2003 03:24 208857

mask
Ты я думаю слышал о argc и argv так и используй их чтобы определить параметр к твоему .exe и соответсвенно выполникь кое какие команды.
Но я тебе советовал бы ключ '/r'  - recursive.
gets(dir) не используй ее бери лучше fgets.

mask 20-05-2003 00:53 208858

#include <stdio.h>
#include <dos.h>
#include <dir.h>
#include <string.h>

char ch[3]="\\", sim1[2]=".", sim2[3]="..";
char sum[MAXPATH], presum[MAXPATH];

int rename_file(char oldn[], char newn[]) {
if (rename(oldn, newn) == 0)
printf("Переименование из %s в %s успешно завершено\n", oldn, newn);
return 0;
}

char find_dir(char *prm1,char *prm2,char *dir){
struct ffblk ffblk;
int don; char dr[MAXPATH];
don = findfirst("*",&ffblk, FA_DIREC);
while (!don) {
int sim21=strcmp(ffblk.ff_name,sim1);
int sim22=strcmp(ffblk.ff_name,sim2);
if( sim21!=0 && sim22!=0 && !don ){
strcpy(presum, dir); strcat(presum, ch);
strcpy(sum, presum); strcat(sum, ffblk.ff_name);

getcwd(dr, MAXPATH);
chdir(sum);
rename_file(prm1,prm2);
find_dir(prm1,prm2,sum);
chdir(dr);
}

don = findnext(&ffblk);
}
return 0;
}

main(int argc, char *argv[]){
if (argc>5)
printf("Неверные параметры \n");
else {
char tekdir[MAXPATH];

getcwd(tekdir, MAXPATH);
chdir(argv[3]);

if (argc==4)
  rename_file(argv[1],argv[2]);
if (argc==5){
 if(strcmp("/s",argv[4])==0){
    rename_file(argv[1],argv[2]);
    find_dir(argv[1],argv[2],argv[3]);
}
else
printf("Неверный параметр \n");
}
chdir(tekdir);
}
return 0;
}


Время: 10:11.

Время: 10:11.
© OSzone.net 2001-