2012-09-06 27 views
6

estoy usando la función de C++ stdio.hrename() devuelve -1. ¿Cómo saber por qué el cambio de nombre falla?

int rename (const char * oldname, const char * newname); 

de cambio de nombre() para cambiar el nombre de una carpeta, pero en ocasiones se produce un error al cambiar el nombre de la carpeta y devuelve -1.

¿Hay alguna forma de saber por qué falla el rename()?
cualquier forma de conocer esta explicación de error a través de cualquier función de C++.

+6

Compruebe la variable 'errno'. Use p. Ej. ['strerror'] (http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx) para obtener una cadena imprimible. –

Respuesta

9

Debería ser posible para obtener el error concreto de errno.h

#include <errno.h> 
#include <string.h> 
... 
if(rename("old","new") == -1) 
{ 
    std::cout << "Error: " << strerror(errno) << std::endl; 
} 

Los errores devueltos son probablemente específica del SO. http://linux.die.net/man/3/rename muestra lo que normalmente puede obtener al usar linux.

2

rename configurará la variable global _errno con el último número de error, verifique eso.

+2

Tenga en cuenta que el guión bajo es un cierto Microsoftism extraño. En C++ estándar, se llama 'errno'. –

2

Compruebe el valor de _errno. Puede ser uno de estos:

EACCES: File or directory specified by newname already exists or could not be created (invalid path); or oldname is a directory and newname specifies a different path. 
ENOENT: File or path specified by oldname not found. 
EINVAL: Name contains invalid characters. 
3

funciones de la API C de este tipo suelen establecer errno cuando no pueden dar más información. La documentación generalmente le informará sobre los valores errno que podría establecer, y también hay una función llamada strerror() que tomará un valor de errno y le devolverá un char * con un mensaje de error legible para el ser humano.

Es posible que deba incluir <errno.h> para acceder a eso.

Con respecto a rename() en MFC, esto parecería ser la documentación para ello: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx que dice que establece errno a EACCES, ENOENT o EINVAL en diversas condiciones, a fin de comprobar en contra de aquellos que averiguar lo que está pasando, con referencia a la documentación de los detalles.

-2

si el archivo está abierto, ciérrelo antes de cambiar el nombre. El código siguiente no funcionará y el nombre del archivo no se puede cambiar.

ofstream _file("C:\\yourfile.txt", ofstream::app); 

if (-1 == rename("C:\\yourfile.txt", "C:\\yourfile2.txt")) 
    puts("The file doesn't exist or already deleted"); 

_file.close(); 
+1

¿Por qué responder una pregunta de hace 2 años, que ya tiene una respuesta aceptada y su respuesta es completamente irrelevante para el problema original? –

0

Si está en Linux que puede simplemente mostrar representación de cadena de error justo después de la llamada fatal para cambiar el nombre mientras que en GDB:

211    if (rename(f_z_name, y) == -1) { 
(gdb) n 
212     err = RM_ERR_RENAME_TMP_Y; 
(gdb) p errno 
$6 = 18 
(gdb) p strerr(errno) 
No symbol "strerr" in current context. 
(gdb) p strerror(errno) 
$7 = 0x7ffff7977aa2 "Invalid cross-device link" 
(gdb) 
Cuestiones relacionadas