2010-12-22 14 views
7

Si el directorio de origen y el directorio de destino, MoveFile realmente haría una copia del archivo de origen en el archivo de destino, lo que significa que terminaré viendo dos archivos.Win32 API para cambiar el nombre de un archivo en C

¿Es esa la mejor manera de que se pueda cambiar el nombre?

+0

de cambio de nombre en stdio.h? – vcsjones

+1

¿Qué quieres decir exactamente? 'MoveFileEx' con' MOVEFILE_COPY_ALLOWED' no le dará dos archivos: llama a CopyFile y luego DeleteFile si los dos archivos están en volúmenes diferentes. – wj32

+0

Creo que he visto casos en los que MoveFile() hará CopyFile() + DeleteFile(), pero el archivo fuente todavía está bloqueado por alguien, por lo que su estado se configurará como Eliminar pendiente; luego, cuando se desbloquea, desaparece mágicamente. O tal vez estoy inventando esto; no puedo recordar – Luke

Respuesta

1

¿Cómo se ve el código? Tengo esto:

if(MoveFile(_T("c:\\hold\\source"),_T("c:\\hold\\dest"))) 
{ 
    printf("succeeded\n"); 
}else 
{ 
    printf("Error %d\n",GetLastError()); 
} 

y no deja la fuente detrás.

1

Es posible que desee intentar usar el MoveFileEx() API sin especificar el MOVEFILE_COPY_ALLOWED para ver si eso proporciona el comportamiento que está buscando.

+0

No especificar MOVEFILE_COPY_ALLOWED simplemente significa que los movimientos de varios volúmenes fallarán. Esto no es lo que quiere el OP. El "simular mediante Copiar/Eliminar" se refiere al hecho de que los movimientos de varios volúmenes no se pueden realizar simplemente reescribiendo los metadatos del disco como se hace para movimientos del mismo volumen. –

+0

@David: pensé que el OP estaba pidiendo una operación de cambio de nombre que solo tuvo éxito si se podía hacer cambiando solo los metadatos del archivo en lugar de copiar/borrar la simulación de cambio de nombre (supongo que la pregunta es un poco confusa para mí). –

+0

Bueno, para ser justos, la pregunta es muy pobre, así que, como suele ser el caso, uno solo puede adivinar cuál fue el intento. Tal vez su interpretación es correcta! –

8

La función MoveFile es realmente lo que desea. A partir de la documentación:

El MoveFile función se moverá (renombrar) un archivo o un directorio (incluyendo sus hijos), ya sea en el mismo directorio o entre directorios.

Si las ubicaciones de origen y de destino están ambas en el mismo volumen, se realiza una operación de cambio de nombre atómico. Si están en volúmenes diferentes, entonces se realiza una operación de copia/eliminación (esto es lo mejor que puedes hacer).

+1

'MoveFileEx' de forma predeterminada solo se mueve, ** no se copiará ** a menos que pase el indicador' MOVEFILE_COPY_ALLOWED'. – unixman83

4

Trate

#include <stdio.h> 

int Result = rename(oldname , newname); 

if (Result) 
    // "Error occurred."); 
else 
    // "File was successfully renamed!"; 
Cuestiones relacionadas