2009-12-20 33 views
7

Tôi đã viết một chương trình điều khiển các tệp và đôi khi tôi xóa một tệp. Vì vậy, tôi đã tìm kiếm và tìm thấy hàm remove() trong tệp tiêu đề stdio trong C.Xóa tệp trong C

Vấn đề là đôi khi không hoạt động và đôi khi không. Đôi khi các tập tin bị xóa, perror khác() cho thấy một thông báo cho biết bị từ chối nhưng tôi đã không chỉ định bất kỳ quyền đặc biệt nào trên tệp. Như một vấn đề của thực tế các tập tin đã được tạo ra một chút trước khi bởi một chức năng khác. Bất kỳ điều kiện đặc biệt nào mà tôi phải cân nhắc?

Dưới đây là chức năng tải mà tạo ra các file:

... 
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; 
} 

Và đây là chức năng sử dụng loại bỏ:

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; 
} 

tôi sử dụng Windows XP.

+0

Đã khắc phục sự cố, chức năng còn lại con trỏ pfile vào tệp đôi khi mở. Cảm ơn câu trả lời của bạn. – Ponty

+0

Chào mừng bạn đến với Stack Overflow! Khi bạn đã nhận được câu trả lời hay cho câu hỏi của mình, vui lòng "chấp nhận" câu trả lời hữu ích nhất bằng cách nhấp vào đường viền hộp kiểm ở bên trái câu trả lời. Điều này cho thấy rằng bạn đã nhận được câu trả lời phù hợp với bạn. Làm điều này giúp tăng danh tiếng của bạn trên trang web. –

Trả lời

6

Bạn chưa chỉ định nền tảng bạn đang sử dụng, nhưng trên Windows, tệp không được mở khi bạn cố xóa nó. (Mọi thứ làm việc một chút khác nhau trên hệ thống Unix-phong cách và delete là hầu như luôn luôn có thể ngay cả khi file đang mở.)

1

Có 3 lý do theo ý kiến ​​của tôi:

  1. Bạn không có quyền để xóa tệp.
  2. Tệp đang được sử dụng bởi một chức năng khác.
  3. Bạn phải ghi lại thư mục trong thư mục mà tệp này được đặt.
2

Trường hợp bạn không thể xóa tệp cũng có thể phụ thuộc vào tệp đang bị khóa bởi một quy trình khác. Trong tình huống của bạn, nó có thể là chức năng của bạn tạo ra các tập tin. Nó cũng phụ thuộc vào nền tảng bạn sử dụng. Nếu đó là Windows, hãy thử sử dụng Trình mở khóa và thử thử lại để xóa tệp.

-1

Tôi có hiểu bạn không: Bạn tạo tệp ở dòng 5 và sau đó trong dòng 7, bạn xóa nó.

Nếu có: thử đặt tạm dừng nhỏ giữa các dòng này, 100 ms phải OK. Hoặc: tệp vẫn mở. Đóng nó và thử xóa nó sau đó.

+0

làm thế nào để trì hoãn trong c? là có một sự chậm trễ() chức năng? – Ponty

0

Thực hiện trước tiên là fclose(). Nếu không, tệp có thể bị khóa. Hoặc có thể chưa được tạo, vì vậy hãy thêm thời gian trễ trước khi xóa.