
MKB-Q140570
RESUMEN
En algunas ocasiones una aplicación necesita eliminar, renombrar o mover archivos que están actualmente en uso. Un ejemplo podrían ser los programas de instalación que necesitan eliminarse a si mismos del disco duro cuando ha finalizado la instalación de un paquete. Algunas veces también necesitan mover algún driver que está siendo usado por el sistema. Las aplicaciones necesitan la ayuda del sistema operativo para borrar o mover esos archivos.
Windows 95 (y superior) y Windows NT (y superior) proporcionan cada uno uno un método para ayudar a las aplicaciones a eliminar, reemplazar o renombrar ficheros y directorios que están en uso. Aunque las dos plataformas difieren en cómo se implementa esos métodos, ambas comparten la estrategia en la que la aplicación especifica qué ficheros procesar y el sistema operativo los procesa cuando rearranca. Este artículo explica cómo las aplicaciones pueden usar el método provisto por cada plataforma.
MAS INFORMACION
Moviendo ficheros en Windows NT
Las aplicaciones Win32 que se ejecutan en Windows NT pueden usar la función MoveFileEx() con el flag MOVEFILE_DELAY_UNTIL_REBOOT para mover, reemplazar o borrar ficheros y directorios que están siendo usados. La prósima vez que el sistema arranque, el programa de arranque de Windows NT moverá, reemplazará o borrará los ficheros y directorios especificados.
Para mover o reemplazar un fichero o directorio en uso, la aplicación debe especificar tanto el origen como el destino en la misma unidad (por ejemplo, la unidad C:). Si el destino es un fichero existente, será sobreescrito. Si el destino es un directorio existente, no será sobreescrito y ambos origen y destino permanecerán sin modificar. He aquí un ejemplo de llamada para mover o reemplzar un fichero o mover un directorio:
// Mover szSrcFile a szDstFile en el próximo arranque
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT)
Para borrar un archivo o directorio, la aplicación debe indicar como destino NULL.
Si el origen es un directorio, será eliminado sólo si está vacío. Tenga en cuenta que si emplea MoveFileEx() para eliminar ficheros de un directorio, debe reiniciar el sistema antes de que pueda llamar a MoveFileEx() para eliminar el directorio. Un ejemplo de cómo eliminar un archivo o directorio vacío :
// Borrar szSrcFile con el próximo arranque
MoveFileEx(szSrcFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
Moving Files in Windows 95
En Windows 95 no está implementada la función MoveFileEx(), pero provee de una manera alternativa para todas las aplicaciones Win-32, Win-16 y MS-DOS para mover, reemplazar o borrar archivos (no directorios) que están en uso. Esta funcionalidad está implementada mediante la sección [rename] del fichero Wininit.ini. Si existe el fichero Wininit.ini en el directorio Windows, Wininit.exe lo procesa cuando arranca el sistema. Una vez que Wininit.ini ha sido procesado, Wininit.exe lo renombra como Wininit.bak.
La sintaxis de la sección [rename]:
DestinationFileName=SourceFileName
DestinationFileName y SourceFileName deben estar en el mismo volumen y deben estar en formato corto (8.3) porque Wininit.ini se procesa antes de cargar el sistema de disco en modo protegido y los nombres largos sólo están disponibles tras la carga de este.
La sección [rename] puede tener múltiples líneas, con un fichero por cada línea. Para borrar un fichero debe especificar NUL como destino. Unos ejemplos :
[rename]
NUL=C:\TEMP.TXT
C:\NEW_DIR\EXISTING.TXT=C:\EXISTING.TXT
C:\NEW_DIR\NEWNAME.TXT=C:\OLDNAME.TXT
C:\EXISTING.TXT=C:\TEMP\NEWFILE.TXT
La primera línea provoca el borrado del fichero Temp.txt. La segunda hace que el fichero Existing.txt sea movido a otro directorio. La tercera causa que Oldname.txt se mueva a otro directorio y se renombre a Newname.txt. La cuarta hace que se sobreescriba el fichero Existing.txt con el Newfile.txt.
Las aplicaciones no deben usar WritePrivateProfileString() par escribir estas entradas en la sección [rename] porque en ella puede haber múltiples líneas con el mismo DestinationFilename, especialmente si este es "NUL". En su lugar, deben añadir entradas leyendo el fichero Wininit.ini y añadiendo las entradas al final de la sección [rename].
NOTA: Utilice siempre una búsqueda no "case sensitive" porque el título de la sección [rename] y los ficheros contenidos en ella pueden aparecer en cualquier combinación de mayúsculas y minúsculas.
Las aplicaciones que usen Wininit.ini deben buscarlo en el directorio de Windows. Si ya existe es que otra aplicación ya ha escrito en él después del arranque del sistema. Entonces la aplicación debe abrirlo y añadir entradas en la sección [rename]. Si no existe, la aplicación debe crearlo y añadir a la sección [rename]. Haciendo esto se asegura de que no borra accidentalmente entradas creadas por otra aplicación.
Para deshacer la operación antes del reinicio del sistema, puedes eliminar las líneas correspondientes del fichero Wininit.ini

