2010-09-07 8 views
5
#include<stdio.h> 

int main() { 

    FILE* fp; 
    fp = fopen("temp.txt", "w"); 
    fprintf(fp, "Hello, World!\n"); 

    // remove("temp.txt"); this requires the filename as an argument 
    // removefile(fp);  <--- is something like this possible? 

    return 0; 
} 

La función de eliminación (defined in stdio.h) toma el nombre del archivo como parámetro, pero no el puntero al archivo.¿Cómo puedo eliminar un archivo señalado por un ARCHIVO * en C?

¿Existe alguna función en las bibliotecas estándar C que elimine archivos, y toma el puntero de archivo como argumento?

Respuesta

1

No, no hay (por desgracia).

7

No creo que haya ninguna forma de hacerlo, porque un ARCHIVO * puede no corresponderse necesariamente con un archivo en el sistema de archivos (por ejemplo, stdin y stdout).

Y en los sistemas de archivos que admiten enlaces duros, puede haber varias rutas que hacen referencia al mismo archivo subyacente, ¿cuál le gustaría eliminar?

1

No, no puedes. Y FILE struct no incluye nombre de archivo dentro de él. Así mejor opción es tener la estructura que a la vez mantenga puntero a FILE y para char* con el nombre

1

Ha cerrado puntero, entonces su valor fue liberado, cómo se imagina borrar un archivo con este mango?

+0

mientras su idea es correcta, no está establecida en NULL en la muestra. – Andrey

+0

@Audrey: 'Cierra el archivo asociado con la secuencia y lo desasocia. – Svisstack

+0

corre, no está configurado como nulo. Es un indicador de memoria liberada y potencial para segv/gpf. De hecho, debe agregar una línea 'fp = 0' justo después de fclose(). – vrdhn

7

Es posible que desee utilizar la función 'FILE * tmpfile (void)' de stdlib.

del hombre:

DESCRIPCIÓN

La función tmpfile() creará un archivo temporal y abrir una secuencia correspondiente . El archivo se se borrará automáticamente cuando se cierren todas las referencias del archivo. El archivo se abre como en fopen() para la actualización (w +).

En algunas implementaciones, un archivo permanente puede quedar atrás si el proceso que llame a tmpfile () se mató mientras está procesando una llamada a tmpfile().

Se puede escribir un mensaje de error en error estándar si la transmisión no puede ser abierta.

+1

¿Cómo funciona este mecanismo en el interior (me refiero a la implementación del método tmpfile)? –

+0

Siempre tiene los códigos fuente de std-lib para ver ... en posix, uno puede abrir un archivo y desvincularse inmediatamente, y el archivo abierto seguirá siendo utilizable. ¡Me pregunto cómo funciona en Windwows! Además ... el punto de que el archivo puede dejarse en el caso del proceso es matar de forma abrupta ... parece implicar atexit() en el trabajo – vrdhn

Cuestiones relacionadas