Удалить файл в C - PullRequest
       7

Удалить файл в C

8 голосов
/ 20 декабря 2009

Я написал программу, которая манипулирует файлами, и я иногда удаляю файл. Поэтому я искал и нашел функцию remove () в заголовочном файле stdio на C.

Проблема в том, что иногда работает, а иногда нет. Иногда файл удаляется, другой perror () показывает сообщение о том, что разрешение отклонено, но я не указал никаких специальных разрешений для файла. На самом деле файл был создан немного раньше другой функцией. Какие-то особые условия, которые я должен учитывать?

Вот функция загрузки, которая создает файл:

...
int loadF ( const char *filename, plist_t pl, int size, int createFlag ) {
    FILE *pFile = NULL;
    pnode_t pn = NULL;
    int fsize;
    int total;
    int i;

    // Get file stream.
    pFile = fopen ( filename, "rb" );
    if ( !pFile ) { // File does not exist.
        if ( createFlag ) {
            if ( !createF ( filename ) ) {
                return 0;   // fail
            }
        } else {    // abort
            perror ( "loadF:fopen" );
            return 0;
        }
    }

    // Confirm that we have opened the file stream.
    if ( !pFile ) {
        pFile = fopen ( filename, "rb" );
        if ( !pFile ) {
            perror ( "loadF:fopen:" );
            return 0;
        }
    }

    // Check if list has not been initialized.
    if ( pl == NULL ) {
        fclose ( pFile );
        pFile = NULL;
        return 0;   // abort
    }

    // Get the size of the file.
    fseek ( pFile, 0, SEEK_END );
    fsize = ftell ( pFile );
    rewind ( pFile );

    // Check if the file is empty.
    if ( !fsize ) {
        fclose ( pFile );
        pFile = NULL;
        return 1;   // No data to load, continue.
    }

    // Get the total number of structures in the file.
    total = fsize / size;

    // Allocate memory for a node to transfer data.
    pn = (pnode_t) malloc ( sizeof (node_t) * sizeof (char) );
    if ( !pn ) {
        fclose ( pFile );
        pFile = NULL;
        perror ( "loadF:malloc" );
        return 0;
    }

    // Copy from file to list every structure.
    for ( i = 1; i <= total; i++ ) {
        if ( feof ( pFile ) ) {
            printf ( "OUT!" );
            break;
        }
        printf ( "g" );
        fread ( pn->key, size, 1, pFile );
        printf ( "f\n" );
        if ( ferror ( pFile ) ) {
            fclose ( pFile );
            pFile = NULL;
            perror ( "loadF:fread" );
            return 0;
        }
        addfirst ( pl, pn->key ); // Maybe we have to allocate memory with malloc every time?
        // Debug with a for loop in the nodes of the list to see if data are OK.
        printf ( "cid = %d\n", pl->head->key->card.cid );
        printf ( "limit = %5.2f\n", pl->head->key->card.limit );
        printf ( "balance = %5.2f\n", pl->head->key->card.balance );
    }

    // Close the stream.
    if ( pFile ) {
        fclose ( pFile );
        pFile = NULL;
    }

    // Deallocate transfer memory.
    if ( pn ) {
        free ( pn );
    }

    // Exit
    return 1;
}

А вот функция, которая использует удаление:

int saveF ( const char *filename, plist_t pl, int size ) {
    FILE *pFile = NULL;     // Pointer to the file structure.
    pnode_t pn = NULL;      // Pointer to a node of a list.


    // Delete the specified file - on success it returns 0.
    if ( remove (filename) == -1 ) {
        perror ( "saveF:remove" );
        return 0;
    }

    // Re-create the file (but now is empty).
    if ( !createF (filename) ) {
        return 0;
    }

    // Get the file stream.
    pFile = fopen ( filename, "ab" );
    if ( !pFile ) {
        perror ( "saveF:fopen" );
        return 0;
    }

    // Check if list is not empty.
    if ( isEmpty ( pl ) ) {
        fclose ( pFile );
        pFile = NULL;
        return 0;           // Abort
    }

    // Traverse the list nodes and save the entity that the key points to.
    for ( pn = pl->head; pn != NULL; pn = pn->next ) {
        fwrite ( (pccms_t)(pn->key), size, 1, pFile );
        if ( ferror ( pFile ) ) {
            fclose ( pFile );
            pFile = NULL;
            perror ( "saveF:fwrite" );
            return 0;
        }
    }

    // Close the stream.
    if ( pFile ) {
        fclose ( pFile );
        pFile = NULL;
    }

    // Exit
    return 1;
}

Я использую Windows XP.

Ответы [ 4 ]

6 голосов
/ 20 декабря 2009

Вы не указали платформу, которую используете, но в Windows файл не должен открываться при попытке удалить его. (В системах Unix все работает немного иначе, и удаление почти всегда возможно, даже если файл открыт.)

2 голосов
/ 20 декабря 2009

Случай, когда вы не можете удалить файл, также может зависеть от файла, заблокированного другим процессом В вашей ситуации это может быть ваша функция создания файлов. Это также зависит от платформы, которую вы используете. Если это Windows, попробуйте использовать Unlocker и повторите попытку, чтобы удалить файл.

1 голос
/ 20 декабря 2009

На мой взгляд, есть 3 причины:

  1. У вас нет разрешения на удаление файла.
  2. Файл используется другой функцией.
  3. Вы должны иметь права записи в каталоге, в котором находится этот файл.
0 голосов
/ 20 декабря 2009

Я вас понимаю? Вы создаете файл в строке 5, а затем в строке 7 вы удаляете его.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...