title: Delete a file in C
body: <p>I have  written a program that manipulates files and I sometimes to delete a file. So I searched and found the remove() function in the stdio header file in C.</p>
  
  <p>The problem is that sometimes works and sometimes not. Sometimes the file is deleted, other perror() shows a message that says permission denied but I have not specified any special permissions on the file. As a matter of fact the file has been created a little before by another function. Any special conditions that I have to consider?</p>
  
  <p>Here is the load function that creates the file:</p>
  
  <pre><code>...
  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 &lt;= total; i++ ) {
          if ( feof ( pFile ) ) {
              printf ( "OUT!" );
              break;
          }
          printf ( "g" );
          fread ( pn-&gt;key, size, 1, pFile );
          printf ( "f\n" );
          if ( ferror ( pFile ) ) {
              fclose ( pFile );
              pFile = NULL;
              perror ( "loadF:fread" );
              return 0;
          }
          addfirst ( pl, pn-&gt;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-&gt;head-&gt;key-&gt;card.cid );
          printf ( "limit = %5.2f\n", pl-&gt;head-&gt;key-&gt;card.limit );
          printf ( "balance = %5.2f\n", pl-&gt;head-&gt;key-&gt;card.balance );
      }
  
      // Close the stream.
      if ( pFile ) {
          fclose ( pFile );
          pFile = NULL;
      }
  
      // Deallocate transfer memory.
      if ( pn ) {
          free ( pn );
      }
  
      // Exit
      return 1;
  }
  </code></pre>
  
  <p>And here is the function that uses remove:</p>
  
  <pre><code>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-&gt;head; pn != NULL; pn = pn-&gt;next ) {
          fwrite ( (pccms_t)(pn-&gt;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;
  }
  </code></pre>
  
  <p>I use Windows XP.</p>