C/C++

Error: Permission denied при переименовании файла,что не так!?!??!?!?!?!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <locale.h>

int main() {
setlocale(LC_ALL, "Rus");
char n[9] = "miki.txt";
FILE* fp, * fp2;

if (!(fp = fopen(n, "w"))) { puts("ошибка при открытии файла1 для записи"); return 1; }

if ((fopen("-.txt", "r"))) {
puts("На вашем устройстве уже имеется файл с именем \"-.txt\".Возможна потеря данных.Для отмены действий введите #\n");
if (getchar() == '#') return 2;
//fclose(fp2);
}
if (!(fp2 = fopen("-.txt", "w"))) { puts("ошибка при открытии файла2 для записи"); return 3; }

//какие-либо действия с этими файлами

fclose(fp); fclose(fp2);
remove(n);
if (!rename("-.txt", n)) puts("Успешно переименновано"); //remove("-.txt");
else std::cout << "Error: " << strerror(errno) << std::endl;
}
А как по вашему, что происходит при
 fopen("-.txt", "r")); 
если такой файл существует?
Подсказка - файл остается висеть открытым и закрыть вы его не можете, так как не получили его идентификатора. Соответственно удалить и переименовать его нельзя.
Ак 47
Ак 47
51 416
Лучший ответ
Роман Кулик В большинстве ОС вы совершенно спокойно можете удалить или переименовать открытый файл (тут, конечно, многое зависит от опций монтирования файловой системы). Windows в этом плане выделяется нестандартным поведением.
Код
 if ((fopen("-.txt", "r"))) {  
puts("На вашем устройстве уже имеется файл с именем \"-.txt\".Возможна потеря данных.Для отмены действий введите #\n");
мягко говоря, очень плохой. Мягко говоря...
Для того, чтобы проверить, существует ли уже такой файл, используется функция access
 int access(const char *pathname, int mode);  

Выглядеть это будет примерно так:
 if( access( "myfile.txt", F_OK ) == 0 )
{
printf( "Файл уже существует\n" );
}
else
{
// Тут надо анализировать переменную errno, чтобы определить, что именно произошло
}
Тут есть еще одна не очевидная штука: если у вас запускаются ДВА или более процессов одновременно, то возможна ситуация, когда оба процесса примерно одновременно вызывают функцию access, оба обнаруживают, что файла нет и его можно спокойно записывать, после чего один процесс записывает файл а другой процесс тут же его перезаписывает с потерей всех сохраненных данных первого процесса. Вот чтобы такой фигни не было, требуется предпринять дополнительные действия. Проще всего это сделать при помощи наложения блокировки на файловый дескриптор при помощи функции flock
Ошибка "Permission denied" возникает, когда у пользователя, запустившего программу, нет необходимых прав доступа для выполнения операции над файлом или директорией. Возможно, у вас нет прав на переименование файла.

Попробуйте выполнить следующие действия:

Убедитесь, что вы запустили программу с правами администратора. Если у вас есть учетная запись администратора, попробуйте запустить программу от имени этой учетной записи.

Проверьте права доступа к файлам и директориям, которые вы пытаетесь изменить. Убедитесь, что у вас есть необходимые права на запись и изменение этих файлов и директорий.

Если вы используете антивирусное ПО или защитную программу, попробуйте временно отключить его и повторить операцию переименования.

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

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

Если вы все еще получаете ошибку "Permission denied", попробуйте связаться с администратором вашей системы или службой поддержки, чтобы получить дополнительную помощь.
Иван Пойда
Иван Пойда
5 964
Ак 47 Не хватает в начале:
"Спасибо что обратились в нашу службу поддержки. Ваше мнение очень важно для нас"
И в конце:
Со всем приветственным уважением и лучшими пожеланиями, старший менеджер по работе с клиентами Иванов Иван )
Ты include <and studio> забыл