2012-09-06 16 views
6

Sto usando la funzione C++ di stdio.hrename() restituisce -1. Come sapere perché il rename fallisce?

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

rename() per rinominare una cartella, ma di tanto in tanto non riesce a rinominare la cartella e ritorna -1.

C'è un modo per sapere perché non viene rinominato()?
qualsiasi modo per conoscere questa spiegazione di errore tramite qualsiasi funzione C++.

+6

Controllare la variabile 'errno'. Utilizzare per es. ['strerror'] (http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx) per ottenere una stringa stampabile. –

risposta

9

Dovrebbe essere possibile ottenere l'errore di cemento da errno.h

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

Gli errori restituiti probabilmente sono specifici del sistema operativo. http://linux.die.net/man/3/rename mostra cosa si può ottenere normalmente, quando si usa Linux.

2

rename imposta la variabile globale _errno con l'ultimo numero di errore, controllare quello.

+2

Si noti che il trattino basso è un po 'strano Microsoftism. Nel C++ standard, si chiama 'errno'. –

2

Verificare il valore di _errno. Può essere una di queste:

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

funzioni C API come questo genere impostato errno quando non riescono a dare più informazioni. La documentazione di solito ti dice circa i valori errno che potrebbe essere impostato, e c'è anche una funzione chiamata strerror() che prenderà un valore errno e ti restituirà un char * con un messaggio di errore leggibile in esso.

Potrebbe essere necessario includere <errno.h> per accedervi.

Per quanto riguarda rename() in MFC, questo sembrerebbe essere la documentazione per esso: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx che dice imposta errno-EACCES, ENOENT o EINVAL in varie condizioni, in modo da controllare nei confronti di coloro di capire cosa sta succedendo, con riferimento alla documentazione per le specifiche.

-2

se il file è aperto, chiuderlo prima di cambiare il nome. Il codice sottostante non funzionerà e il nome del file non può essere modificato.

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

Perché rispondere a una domanda di 2 anni, che ha già una risposta accettata e la tua risposta è completamente irrilevante rispetto al problema originale. –

0

Se siete su Linux si può semplicemente visualizzare rappresentazione di stringa di errore poco dopo la chiamata fatale per rinominare mentre in 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) 
Problemi correlati