2011-11-18 12 views
5

Tengo que eliminar algunos cientos de archivos dentro de mi código C. Yo uso "eliminar" en un bucle. ¿Hay alguna forma más rápida de hacerlo que usar "eliminar"? Pregunto esto porque no puedo dar comodines usando "eliminar".eliminando archivos del código C

+0

¿Por qué no canaliza el resultado de un ls dentro del bucle para que no tenga que escribir todos los nombres? – lc2817

+0

El problema es que hay 50000 archivos en ese directorio. Debo eliminar solo algunos de ellos cuando sea necesario. "eliminar" funciona bien para mí, pero lleva un tiempo terminarlo. Estoy buscando algo más rápido. No quiero invocar comandos de shell desde "C" si puedo hacer lo mismo en "C". – Kitcha

+0

¿Podría usar Python? :) – lc2817

Respuesta

10

No, no hay una manera más rápida que usar remove() - o unlink() en sistemas POSIX - en un bucle.

El comando del sistema rm también lo hace, al menos en el caso simple, no recursivo, donde los nombres se dan en la línea de comando. El intérprete de comandos expande los metacaracteres, y rm (en) va muy bien eliminando lo que se le dijo que borre, sin darse cuenta de la desastrosa notación *.* que se usó en la línea de comando. (En el caso recursivo, que utiliza una función como nftw() para atravesar la estructura de directorios de llamadas de profundidad-primer orden y repetidas a unlink() para eliminar los archivos y rmdir() para eliminar los directorios (ahora vacíos).)

POSIX proporciona funciones (glob() y wordexp()) para generar listas de nombres de archivos de metacaracteres tal como se utilizan en el shell (POSIX), más fnmatch() para ver si un nombre coincide con un patrón.

+0

¿No es '*' lo mismo que '*. *', O hay alguna diferencia sutil? Cuando las personas mencionan un apocalipsis 'rm', siempre parecen usar' *. * ' –

+0

En Windows' *. * 'Era necesario; en Unix, '*' es suficiente (en realidad, más devastador que '*. *' ya que el simple '*' coincide con más nombres). Discutí marginalmente cuál usar y (para bien o para mal) elegí '*. *'. Ambas son malas noticias. (Y el peor cataclismo 'rm' que he visto fue eliminar la cuenta de un usuario temporal creado con la raíz'/'como su directorio principal; el comando 'eliminar usuario' eliminó todo lo que estaba debajo de su directorio personal. Es sorprendente cuánto tiempo el sistema puede ejecutarse después de perder archivos cruciales. Afortunadamente, era un sistema completamente nuevo y hubo una copia de seguridad del día anterior.) –

+0

Gracias por su contribución. Puedo generar los nombres de archivo sin ningún problema. Mi única preocupación era emitir el comando "Eliminar" más rápido. – Kitcha

0

Puede usar system para generar un caparazón que haría la * expansión por usted. Sin embargo, esto probablemente no se ejecutará más rápido que simplemente llamar a unlink() en un bucle, ya que tendría que generar un shell (iniciar un nuevo proceso). Pero sería más fácil codificar.

Cuestiones relacionadas