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

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

03.04.2011, 16:14. Показов 7538. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru