Permission denied accessing file

1

I have a function in my program where it shows all the students registered in a binary file, the user selects which one to delete, a confirmation screen with the user data waiting for the input appears for then deletion confirmation occurs.

When registering a student and deleting it, the program works correctly, after another enrollment, I can no longer exclude students. Follow the function below. A perror(); in remove(arqAlunos) returns the following string Permission Denied.

void excluirAluno () {
// Declarações locais
    struct Alunos aluno;
    FILE *arqAlunos = NULL, *arqTemp = NULL;
    int posicaoArquivo = 0, totalPosicoes = 0, flag1 = 0, flag2 = 0, contador = 0;
    char opcao;
// Instruções
    do {
        posicaoArquivo = apresentaAlunos(); // Apresenta todos os alunos cadastrados no sistema (caso exista algum).
        arqAlunos = fopen(ARQ_ALUNOS, "rb"); // Abre para leitura.
        if (arqAlunos != NULL) { // Considera a existência do arquivo...
            fseek(arqAlunos, 0, SEEK_END); // Posiciona-se no final do arquivo.
            totalPosicoes = (ftell(arqAlunos) / sizeof(aluno)); // Cálculo do total de bytes na primeira posição do arquivo.
            if (posicaoArquivo != 0) { // Considera que existe ao menos um aluno cadastrado no sistema.
                fseek(arqAlunos, ((posicaoArquivo - 1) * sizeof(aluno)), SEEK_SET); // Posiciona-se na posição referente ao cálculo do segundo parâmetro.
                if (fread(&aluno, sizeof(aluno), 1, arqAlunos) == 1) { // Lê os dados do arquivo um a um.
                    flag1 = verificaAlunoMatriculado(aluno.matricula); // Verifica se o aluno está matriculado em algum curso.
                    clrscr();
                    desenhaMoldura(10, 10, 18, 70, PRETO, BRANCO, 2, 1);
                    gotoxy(11,11);
                    printf("%-19.19s%-14.14s%-13.13s%-13.13s", "NOME", "CPF", "SEXO", "MATRICULA");
                    gotoxy(11,12);
                    printf("%-16.16s%-9.11s %11.11s%13d", aluno.nome, aluno.CPF, aluno.sexo, aluno.matricula);
                    gotoxy(15,16);
                    printf("DESEJA EXCLUIR OS DADOS DESTE ALUNO? (S / N): ");
                    fflush(stdin);
                    scanf("%c", &opcao);
                    fflush(stdin);
                    opcao = toupper(opcao);
                    while ((opcao != 'S') && (opcao != 'N')) {
                        clrscr();
                        desenhaMoldura(10, 10, 14, 40, PRETO, BRANCO, 2, 1);
                        gotoxy(11,11);
                        printf("OPCAO INVALIDA");
                        gotoxy(11,12);
                        printf("UTILIZE [S] OU [N]");
                        gotoxy(11,13);
                        printf("SUA ESCOLHA: ");
                        fflush(stdin);
                        scanf("%c", &opcao);
                        fflush(stdin);
                        opcao = toupper(opcao);
                    }
                    if ((opcao == 'S') && (flag1 == 0)) { // Caso o usuário deseje remover um aluno e ele não esteja matriculado em algum curso.
                        clrscr();
                        arqTemp = fopen(ALUNOS_TEMP, "wb"); // Criação de um arquivo temporário para os alunos.
                        if (arqTemp != NULL) {
                            rewind(arqAlunos); // Vai para o início do arquivo.
                            while (!feof(arqAlunos)) { // Enquanto não atingir o final do arquivo.
                                if (fread(&aluno, sizeof(aluno), 1, arqAlunos) == 1) { // Lê dados um a um no arquivo.
                                    contador++; // Incremento do contador.
                                    if (contador != posicaoArquivo) { // Enquanto contador não atingir o total de registros gravados no arquivo...
                                        if (fwrite(&aluno, sizeof(aluno), 1, arqTemp) != 1) { // Gravará todos os dados originais no arquivo temporário.
                                            desenhaMoldura(10, 10, 12, 40, PRETO, BRANCO, 2, 1);
                                            gotoxy(11,11);
                                            printf("ERRO AO GRAVAR ARQUIVO TEMPORÁRIO.");
                                            getch();
                                        }
                                    }
                                }
                            }
                            if (fclose(arqAlunos) != 0) { // Caso ocorra erro ao fechar o arquivo principal.
                                desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
                                gotoxy(11,11);
                                printf("ERRO AO FECHAR O ARQUIVO PRINCIPAL.\n");
                                gotoxy(11,12);
                                perror("Erro");
                                getch();
                            }
                            else {
                                flag2 = 1;
                                if (fclose(arqTemp) != 0) { // Caso ocorra erro ao fechar o arquivo temporário.
                                    desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
                                    gotoxy(11,11);
                                    printf("ERRO AO FECHAR O ARQUIVO TEMPORARIO.\n");
                                    gotoxy(11,12);
                                    perror("Erro");
                                    getch();
                                }
                                else {
                                    if (remove(ARQ_ALUNOS) != 0) { // Caso ocorra erro ao remover o arquivo principal.
                                        desenhaMoldura(10, 10, 13, 46, PRETO, BRANCO, 2, 1);
                                        gotoxy(11,11);
                                        printf("ERRO AO REMOVER O ARQUIVO ALUNOS.\n");
                                        gotoxy(11,12);
                                        perror("Erro");
                                        getch();
                                    }
                                    else {
                                        if (rename(ALUNOS_TEMP, ARQ_ALUNOS) != 0) { // Caso ocorra erro ao renomear o arquivo temporário.
                                            desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
                                            gotoxy(11,11);
                                            printf("ERRO AO RENOMEAR ARQUIVO.\n");
                                            gotoxy(11,12);
                                            perror("Erro");
                                            getch();
                                        }
                                        else {
                                            // Caso tudo ocorra corretamente, a mensagem abaixo será exibida.
                                            desenhaMoldura(10, 10, 12, 40, PRETO, BRANCO, 2, 1);
                                            gotoxy(11,11);
                                            printf("EXCLUSAO REALIZADA COM SUCESSO!");
                                            getch();
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else {
                        if (flag1 == 1 && opcao == 'N') {
                            return;
                        }
                        else if (flag1 == 1) {
                            // 'flag1' indica que o aluno já está matriculado em algum curso, portanto não poderá ser excluido do sistema.
                            clrscr();
                            desenhaMoldura(10, 10, 13, 55, PRETO, BRANCO, 2, 1);
                            gotoxy(11,11);
                            printf("ESTE ALUNO JA ESTA MATRICULADO EM UM CURSO.");
                            gotoxy(11,12);
                            printf("NAO PODERA SER REMOVIDO DO SISTEMA.");
                            getch();
                        }
                    }
                }
            }
            if (flag2 == 0) {
                if (fclose(arqAlunos) != 0) {
                    desenhaMoldura(10, 10, 13, 40, PRETO, BRANCO, 2, 1);
                    gotoxy(11,11);
                    printf("ERRO AO FECHAR O ARQUIVO ALUNOS.\n");
                    gotoxy(11,12);
                    perror("Erro");
                    getch();
                }
            }
        }
    clrscr();
    } while (posicaoArquivo != 0);
  }
    
asked by anonymous 08.11.2014 / 13:43

1 answer

3

The file is open. You can not remove open files. You need to close it first. This error indicates that you are not allowed to do just that.

Your code is pretty confusing, it's very easy to get lost in what state the file is.

There's a chance you're trying to remove(arqAlunos) but I do not know if it's a kick, you can not understand the code. Even if this seems to solve the problem, the code certainly has other problems not so apparent. Code running on a test does not mean they're right.

    
08.11.2014 / 15:42