Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 20

Не работает переименование файла

19.05.2014, 23:45. Показов 1933. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть задание :

Для всех исполнительных файлов определенного владельца выполнить смену имени. Файлы находятся в заданной директории. Входные параметры задаются через командную строку

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

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
81
82
83
84
85
86
87
88
89
90
91
#include <pwd.h>
#include <stdio.h>
#include <errno.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
using namespace std;
 
void usage(void)
{
    printf("Use program with following options:\n");
    printf("\n");
    printf("-p PATH    set path to directory\n");
    printf("-u USER    set user name\n");
    printf("-h     help\n");
    printf("\n");
}
 
int main(int argc, char** argv) {
DIR *dir;
FILE *file;
int rez = 0;
int path_length = 0;
int status = 0;
struct stat file_stats;
struct passwd *user_info;
char file_path[NAME_MAX];
struct dirent *dir_content;
char *path, *user, *buf_string, *result;
 
if(argc < 3)
{
    usage();
    exit(EXIT_FAILURE);
}
 
while ( (rez = getopt(argc,argv,"hp:u:")) != -1)
{    
    switch (rez)
    {
        //Taking arguments from argv[]
        case 'h': usage();break;
        case 'p': path=optarg; path_length = strlen(path); break;
        case 'u': user=optarg; break;
        case '?': usage(); break;
    }
}
 
if ( (dir=opendir(path)) == NULL )
{
    fprintf(stderr, "Error while opening directory\n");
    exit(EXIT_FAILURE);
}
 
if ( (user_info = getpwnam(user)) == NULL )
{
    fprintf(stderr, "Error, there's no specified user in system\n");
    closedir(dir);
    exit(EXIT_FAILURE);
}
printf("%s\n", user);
printf("%s\n", path);
printf("%d\n", path_length);
printf("%s\n", user_info->pw_name);
while ( (dir_content = readdir(dir)) != NULL )
{
    if ( dir_content->d_type != 4 )
    {
        sprintf(file_path, "%s%s", path, dir_content->d_name);
        printf("%s\n", file_path);
        if ( (file=fopen(file_path, "r")) == NULL )
            perror("File cannot be opened");
        stat(file_path, &file_stats);
        fclose(file);
        if ( (file_stats.st_uid == user_info->pw_uid) )  
                                    //&& (S_IXUSR )
        {
            buf_string = strcat(file_path, ".sh");
            printf("%s\n", buf_string);
            if ( rename(file_path, buf_string) != 0 )
                perror("File wan not renamed");
        }
    }
}
 
closedir(dir);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2014, 23:45
Ответы с готовыми решениями:

Переименование файла, запуск приложения и обратное переименование после закрытия приложения
Есть файл который нужно переименовать с последующим запуском приложения от имени администратора, а после завершения приложения обратное...

Переименование XML файла, используя текст внутри этого файла
Есть огромное количество XML файлов. Необходимо переименовать их в текст, содержащийся между тегами...

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

6
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
20.05.2014, 08:39
Лучший ответ Сообщение было отмечено Justin как решение

Решение

Цитата Сообщение от Justin Посмотреть сообщение
C++
1
buf_string = strcat(file_path, ".sh");
При этом file_path изменяется.
1
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 20
20.05.2014, 20:24  [ТС]
Хм, я даже и не думал там смотреть.
Спасибо большое, gng,
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
29.09.2014, 21:07
Собственно говоря, все идеально работает,
Ты так считаешь?
Вся твоя программа один сплошной toctou. Открываешь один файл, стат делаешь на второй, а потом впридачу делаешь небезопасный ренэйм, который в posix-compliant системе удаляет целевой файл.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
30.09.2014, 08:35
Цитата Сообщение от _1_ Посмотреть сообщение
небезопасный ренэйм, который в posix-compliant системе удаляет целевой файл
Можно увидеть документальное подтверждение сего?
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
30.09.2014, 16:33
с11
The rename function causes the file whose name is the string pointed to by old to be
henceforth known by the name given by the string pointed to by new. The file named
old is no longer accessible by that name. If a file named by the string pointed to by new
exists prior to the call to the rename function, the behavior is implementation-defined.

posix 2008
If the link named by the new argument exists and the file's link count becomes 0 when it is removed and no process has the file open, the space occupied by the file shall be freed and the file shall no longer be accessible. If one or more processes have the file open when the last link is removed, the link shall be removed before rename() returns, but the removal of the file contents shall be postponed until all references to the file are closed.

Linux man
If newpath already exists, it will be atomically replaced (subject to
a few conditions; see ERRORS below), so that there is no point at
which another process attempting to access newpath will find it
missing.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
30.09.2014, 16:56
Вся эта котовасия с ссылками имеет под собой то же самое, что и
Цитата Сообщение от _1_ Посмотреть сообщение
If a file named by the string pointed to by new
exists prior to the call to the rename function
Удаление файла на posix вполне укладывается в
Цитата Сообщение от _1_ Посмотреть сообщение
behavior is implementation-defined
То есть: нечего кодить поперек документации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.09.2014, 16:56
Помогаю со студенческими работами здесь

Переименование одного файла именем файла в той же папки
Добрый день! Возникла проблема с Батом! В одной папке находится файл .xml и файл .zip. Мне необходимо присвоить .zip имя .xml Вот...

Переименование файла
У меня на сайте около 100 000 загруженных пользователями фотографий. Они прописаны в базе. За все время работы сайта примерно половина...

Переименование файла
Ну например, ввели Вы путь, нажали ENTER, появился список файлов. Ввели имя файла. Он переименовался. мне нужно сделать такой батник)...

Переименование файла
Здравствуйте. Скажите пожалуйста как можно записать данные в файл под заданным с клавиатуры именем. Мой пример процедуры: procedure...

переименование файла
Странно!! RenameFile(&quot;name.wav&quot;, ListBox1-&gt;Items-&gt;Strings+&quot;_&quot;+a+&quot;.wav&quot;); так переименовывает RenameFile(&quot;name.wav&quot;,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru