Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/35: Рейтинг темы: голосов - 35, средняя оценка - 4.71
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767

Переименование файлов

03.04.2011, 16:14. Показов 7370. Ответов 31
Метки нет (Все метки)

трудно сказать к какому разделу относится тема...

вообщем надо чтобы программа на си переименовывала все файлы в нескольких каталогах.(каталоги вводит пользователь)
как это сделать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2011, 16:14
Ответы с готовыми решениями:

Не работает переименование файла
В общем есть задание : Для всех исполнительных файлов определенного владельца выполнить смену имени. Файлы находятся в заданной...

Переименование PDF-файлов в имена, берущиеся из содержимого этих файлов
Всем доброго времени суток!:) Подскажите, пожалуйста, как переименовать файл с расширением pdf, взяв сам текст для наименования файла из...

Переименование файлов именами существующих файлов
Доброго времени суток! Помогите, пожалуйста, решить задачу. Не программист, сам бат-ники писать их не умею, знаю только, что с их помощью...

31
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.04.2011, 13:12
1 strlen() возвращает длину строки без '\0', а strcpy() копирует включая '\0', соответсвенно у вас там выход за границу s.
2 Ваш flag бессмыслица т.к. на момент проверки всегда равен true
3 да
2
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.04.2011, 14:30  [ТС]
тогда получается переименовывать надо всегда независимо от того если в имени А или нет?или же проверить имя и если есть то тогда уже копировать и преобразовывать?

Добавлено через 11 минут
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
либо указывать в rename() пути к файлам, а не их имена
так?
C
1
2
3
4
5
6
7
8
9
while(entry=readdir(d))
    {
      char s[strlen(entry->d_name)+1];
      strcpy(s,entry->d_name);
      for(i=0;i<strlen(s);i++)
       if (s[i]==c) s[i]='0'; //c - символ
      strcat(s,x);//имя файла с путем объединяется
      rename(s,entry->d_name);
    }
и с entry->d_name конкатенировать?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.04.2011, 15:08
Цитата Сообщение от Artishok Посмотреть сообщение
strcat(s,x);//имя файла с путем объединяется
Вы опять почему то решили, что s резиновый?
А что будет если s[strlen(s) - 1] != '/' ?
Цитата Сообщение от Artishok Посмотреть сообщение
и с entry->d_name конкатенировать?
да
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.04.2011, 21:38  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Сообщение от Artishok
и с entry->d_name конкатенировать?
да
так это получается что прога считывает файл и забывает откуда его взяла?

Добавлено через 2 часа 28 минут
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
А что будет если s[strlen(s) - 1] != '/' ?
так как правильно?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.04.2011, 21:47
Писать что-то за вас я не собираюсь. Попробуйте обратиться в раздел фриланса чтоб написали это за вас или хотя бы объяснили за не дорого, что будет если склеить строки "/bin" и "bash".
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.04.2011, 21:48  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Сообщение от Artishok
и с entry->d_name конкатенировать?
да
но ведь я в entry записываю конкатенированное s а следовательно если
например
каталог
/home/chuck/papka/
сосчитал файл taxt.txt
записал его имя в s
taxt.txt
после обработки
t0xt.txt
я конкатенирую с /home/chuck/papka/t0xt.txt
и в считанный text.txt записываю /home/chuck/papka/t0xt.txt
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.04.2011, 22:12
Да, это все так, до тех пор пока путь задаваемый в opendir() заканчивается на '/', tcли вы так и планируете оставить /home/.../ закодированным в исходный код все будет работать, но если вы вдруг так неожиданно решите, что не плохо бы научить программу проделавать всю работу для любого произвольного каталога задаваемого в командной строке, то возможны проблемы.
Про то, что у вас получается file/home/.../ после strcat() я уж молчу...
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
06.04.2011, 22:26  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Про то, что у вас получается file/home/.../ после strcat() я уж молчу...
strcat объединяет в s из x
char * strcat(char * restrict dst, const char * restrict src);
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.04.2011, 22:34
Да именно так и есть.
C
1
2
3
4
5
6
7
while(entry=readdir(d))
    {
          char s[strlen(entry->d_name)+1];
      strcpy(s,entry->d_name);
          for(i=0;i<strlen(s);i++)
           if (s[i]==c) s[i]='0'; //c - символ
      strcat(s,x);//имя файла с путем объединяется
в dst у вас как раз имя, что в x науке не известно, но предположим что путь
итог: имя+х и переполнение s
0
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
07.04.2011, 04:08  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
в dst у вас как раз имя, что в x науке не известно, но предположим что путь
да это путь,который передается через указатель в функцию

Добавлено через 14 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <dirent.h>
int main(int argc, char ** argv)
{
DIR * d;
struct dirent * entry;
if (argc != 2)
{
printf("Использование: %s <директория>\n", argv[0]);
return 0;
}
d = opendir(argv[1]);
if (d == NULL)
{
printf("Ошибка чтения директории\n");
return 1;
}
while (entry = readdir(d))
printf("%s inode=%i\n", entry->d_name, entry->d_ino);
closedir(d);
return 0;
}
если бы эта прога работала то тогда многое стало бы понятно
а так ввожу ./program 2 /home/chuck/filegrub
и она выходит после первого if

Добавлено через 16 минут
а.неважно.

Добавлено через 1 час 17 минут
кароч разобрался

Добавлено через 57 минут
да.действительно не переименовывает файлы вне каталога.
в чем одна проблема проявилась.когда я ввожу ./program .
прога вылетает с ошибкой
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
** glibc detected *** ./program: free(): invalid next size (fast): 0x095b0028 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0xb77a6501]
/lib/libc.so.6(+0x6dd70)[0xb77a7d70]
/lib/libc.so.6(cfree+0x6d)[0xb77aae5d]
./program[0x804888f]
/lib/libc.so.6(__libc_start_main+0xe7)[0xb7750ce7]
./program[0x80485b1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 666063     /home/cyberchuck/filegrub/program
08049000-0804a000 r--p 00000000 08:01 666063     /home/cyberchuck/filegrub/program
0804a000-0804b000 rw-p 00001000 08:01 666063     /home/cyberchuck/filegrub/program
095a8000-095d1000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b770d000-b7727000 r-xp 00000000 08:01 1051424    /lib/libgcc_s.so.1
b7727000-b7728000 r--p 00019000 08:01 1051424    /lib/libgcc_s.so.1
b7728000-b7729000 rw-p 0001a000 08:01 1051424    /lib/libgcc_s.so.1
b7739000-b773a000 rw-p 00000000 00:00 0 
b773a000-b7891000 r-xp 00000000 08:01 1051389    /lib/libc-2.12.1.so
b7891000-b7893000 r--p 00157000 08:01 1051389    /lib/libc-2.12.1.so
b7893000-b7894000 rw-p 00159000 08:01 1051389    /lib/libc-2.12.1.so
b7894000-b7897000 rw-p 00000000 00:00 0 
b78a6000-b78a9000 rw-p 00000000 00:00 0 
b78a9000-b78aa000 r-xp 00000000 00:00 0          [vdso]
b78aa000-b78c6000 r-xp 00000000 08:01 1051365    /lib/ld-2.12.1.so
b78c6000-b78c7000 r--p 0001b000 08:01 1051365    /lib/ld-2.12.1.so
b78c7000-b78c8000 rw-p 0001c000 08:01 1051365    /lib/ld-2.12.1.so
bfcfa000-bfd1b000 rw-p 00000000 00:00 0          [stack]
Аварийный останов
какая-то аварийная остановка.но переименовывает верно.вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <err.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
 
/*void Renamer(struct dirent *d,DIR *dd,char k)
{
    while((d=readdir(dd))!=NULL)
  {
    //имя всех файлов
    printf("\n%s\n",d->d_name);
    char *x=(char*)malloc(strlen(d->d_name));
    strcpy(x,d->d_name);
    int i;
    for(i=0;i<strlen(x);i++)
     if (x[i]==k) x[i]='0'; 
    rename(d->d_name,x);
    //printf("\n Gnome--- %s\n",x);
    free(x);
  }
}*/
 
int main(int argc,char *argv[])
{
  DIR *dir;
  struct dirent *de;
  if (argc==1)
     errx(1,"Expected directory %s ",*argv);
  else if (argc>2)
    errx(1,"Extra argument %s",*argv);
  if ((dir=opendir(argv[1]))==NULL)
    err(1,"Open dir %s",argv[1]);
  printf("Directory %s",argv[1]);
  char c='e';
  //Renamer(de,dir,c);
   while((de=readdir(dir))!=NULL)
  {
    //имя всех файлов
    printf("\n%s\n",de->d_name);
    char *x=(char*)malloc(strlen(de->d_name));
    strcpy(x,de->d_name);
    int i;
    for(i=0;i<strlen(x);i++)
     if (x[i]==c) x[i]='0'; 
    rename(de->d_name,x);
    //printf("\n Gnome--- %s\n",x);
    free(x);
  }
  closedir(dir);
  dir=opendir(argv[1]);
  c='l';
   while((de=readdir(dir))!=NULL)
  {
    //имя всех файлов
    printf("\n%s\n",de->d_name);
    char *x=(char*)malloc(strlen(de->d_name));
    strcpy(x,de->d_name);
    int i;
    for(i=0;i<strlen(x);i++)
     if (x[i]==c) x[i]='0'; 
    rename(de->d_name,x);
    //printf("\n Gnome--- %s\n",x);
    free(x);
  }
  //Renamer(de,dir,c);
  if (errno==EBADF)
    err(1,"%s",argv[1]);
  if (closedir(dir)==-1)
    err(1,"closedir %s",argv[1]);
  char *s=(char*)malloc(strlen(argv[1]));
 // printf("String\n");
  strcpy(s,argv[1]);
  puts(s);
  free(s);
 
  exit(0);
}
Добавлено через 2 часа 40 минут
все работает теперь без ошибок.ошибка была из-за путей к файлу.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2011, 12:28
Пути не причем, вы с каким то тупым упорством наступаете на одни и те же грабли, Запишите себе куда-нибудь: для копирования строк памяти надо выделять на 1 байт больше чем размер строки возвращаемый strlen()
2
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
07.04.2011, 19:24  [ТС]
в проге где надо было переименовывать через потоки прога работает нормально(пусть и ведет себя забавно с файлами вне её каталога). но там где последовательно переименовывается почему-то вторая часть проги не выволняется
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <err.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
 
const char* path="/home/cyberchuck/filegrub";
 
int main(int argc,char *argv[])
{
  int i,result;
  char c;
  DIR *dir;
  struct dirent *de;
  dir=opendir(path);
  c='e';
  while((de=readdir(dir))!=NULL)
  {
    char *newfilename=(char*)malloc(strlen(de->d_name)+strlen(path)+2);
    char *oldfilename=(char*)malloc(strlen(de->d_name)+strlen(path)+2);
    char *x=(char*)malloc(strlen(de->d_name)+1);
    strcpy(x,de->d_name);
    for(i=0;i<strlen(x);i++)
    if (x[i]==c) x[i]='0';
    strcpy(oldfilename,path);
    strcat(oldfilename,"/");
    strcat(oldfilename,de->d_name);
    strcpy(newfilename,path);
    strcpy(newfilename,"/");
    strcpy(newfilename,x);
    result=rename(oldfilename,newfilename);
    free(x);
    free(newfilename);
    free(oldfilename);
  }
  c='t';
  while((de=readdir(dir))!=NULL)
  {
    char *newfilename=(char*)malloc(strlen(de->d_name)+strlen(path)+2);
    char *oldfilename=(char*)malloc(strlen(de->d_name)+strlen(path)+2);
    char *x=(char*)malloc(strlen(de->d_name)+1);
    strcpy(x,de->d_name);
    for(i=0;i<strlen(x);i++)
    if (x[i]==c) x[i]='0';
    strcpy(oldfilename,path);
    strcat(oldfilename,"/");
    strcat(oldfilename,de->d_name);
    strcpy(newfilename,path);
    strcpy(newfilename,"/");
    strcpy(newfilename,x);
    result=rename(oldfilename,newfilename);
    free(x);
    free(newfilename);
    free(oldfilename);
  }
  closedir(dir);
 
 
  exit(0);
}
получается что что-то становится равным NULL?

Добавлено через 6 часов 5 минут
Сделал по другому.тему можно закрывать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2011, 19:24

Рекурсивное переименование файлов, md5-хеш которых совпадает с md5-хешем, указанном в списке файлов
Есть файл из двух колонок md5-хеш и имя файла (краткое, с расширением, UTF-8). Есть каталог с множеством файлов во всевозможных...

Переименование файлов в папках с добавлением к именам этих файлов имён этих папок
Есть 4 папки с архивом записей с камеры видеонаблюдения с именами 13 14 15 16. В каждой папке находится 60 минутных файлов в формате...

Переименование файлов
Народ, оживите код, надо переименовать 560 файлов Sub имя() Dim sFileName As String, sNewFileName As String For i = 1 To 560 ...

Переименование файлов.
Здравствуйте! Есть задача: во всех подкаталогах указанного в качестве параметра каталога (и в нем самом) переименовать все файлы в...

Переименование файлов
Привет, господа! У меня вопрос по поводу переименования файлов. Коротко о моей проблеме: нужно создать консольную прогу с ключами, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru