Permission denied accessing file

Asked

Viewed 250 times

1

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

When I register a student and delete him, the program works correctly, after another registration, I can no longer delete students. Follows below the function. A perror(); in the remove(arqAlunos) returns me 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);
  }

1 answer

3


The file is open. You cannot remove open files. You need to close it first. This error indicates that you do not have permission precisely because of this.

Your code is quite confused, it is very easy to get lost in what state the file is in.

There’s a chance you’re trying to do remove(arqAlunos) But I don’t know, it’s a guess, you can’t 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 doesn’t mean they’re right.

  • But the file I want to remove is already the first to be closed in the if-I section.

  • It didn’t close. And note the second paragraph of the answer. Since your code is very confusing you don’t realize that it didn’t close it.

  • I will redo my file data deletion code. What would you recommend to make the code less confusing and not rediscover the problem of not knowing the state of the file.

  • Start by setting a clear naming pattern for the variable name preferably what is customary to use in C. This goes for code formatting as well, you don’t follow a pattern and even when it follows it is very difficult to understand. Each variable you use a pattern and this disturbs. Your "function" tries to do everything, try to separate the various tasks into other functions. Do not leave large blocks of code, it is difficult to see where it ends, especially when it accumulates with the next problem. Avoid such a cyclomatic complexity, in other words do not have so many levels of endentation.

  • Try to separate logic from code from error handling logic. Avoid so much flag, when there is a lot is because the code is poorly structured. Code law of other people who code well. You will notice that it looks nothing like your code. If you don’t see the difference, you will have problems programming. There’s no point in commenting on code when the code doesn’t even do what the comment says. That’s why most experienced programmers (really) barely comment on code. They comment "why it does" and not "what it does". And you rarely need to say why you do it if the code is well written.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.