2009-12-20 2 views
7

Я написал программу, которая управляет файлами, и иногда я удаляю файл. Поэтому я искал и нашел функцию remove() в файле заголовка stdio в C.Удалить файл в 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.

+0

Исправлена ​​ошибка, функция оставляла указатель pfile на файл, который иногда открывается. Спасибо за ваши ответы. – Ponty

+0

Добро пожаловать в переполнение стека! Когда вы получили хороший ответ на свой вопрос, пожалуйста, «примите» наиболее полезный ответ, нажав на блокнот слева от ответа. Это означает, что вы получили ответ, который сработал для вас. Это помогает повысить репутацию на сайте. –

ответ

6

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

1

Есть 3 причины, по-моему:

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

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

-1

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

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

+0

как задержать c? есть ли функция delay()? – Ponty

0

Сделайте сначала fclose(). В противном случае файл может быть заблокирован. Или он, возможно, еще не создан, поэтому добавьте задержку перед удалением.

Смежные вопросы