2012-09-06 9 views
6

Ich bin mit C++ stdio.h desrename() gibt -1 zurück. Wie kann ich wissen, warum die Umbenennung fehlschlägt?

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

rename() Funktion einen Ordner umbenennen, aber gelegentlich versagt es den Ordner und kehrt zu benennen -1.

Gibt es eine Möglichkeit zu wissen, warum ist rename() fehlgeschlagen?
eine Möglichkeit, diese Fehlererklärung über eine beliebige C++ - Funktion zu kennen.

+6

Überprüfen Sie die 'errno' Variable. Verwendung z.B. ['strerror'] (http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx) um eine druckbare Zeichenfolge zu erhalten. –

Antwort

9

Es sollte möglich sein, den konkreten Fehler von errno.h

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

Die zurückgegebenen Fehler wahrscheinlich OS-spezifisch sind, zu erhalten. http://linux.die.net/man/3/rename zeigt, was Sie normalerweise erhalten können, wenn Sie Linux verwenden.

2

rename wird die globale Variable _errno mit der letzten Fehlernummer gesetzt, überprüfen Sie das.

+2

Beachten Sie, dass der Unterstrich ein seltsamer Microsoft ist. In Standard C++ heißt es 'errno'. –

2

Überprüfen Sie den Wert _errno. Es kann einer von diesen sein:

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

C-API-Funktionen wie dies in der Regel errno gesetzt, wenn sie nicht mehr Informationen geben. Die Dokumentation wird normalerweise über errno Werte informieren, die es setzen könnte, und es gibt auch eine Funktion namens strerror(), die einen errno Wert nimmt und Ihnen eine char * mit einer menschenlesbaren Fehlermeldung zurückgibt.

Möglicherweise müssen Sie <errno.h> für den Zugriff darauf einfügen.

Hinsichtlich rename() in MFC, würde dies scheinen die Dokumentation für sie zu sein: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx, die sagt, es setzt errno-EACCES, ENOENT oder EINVAL unter verschiedenen Bedingungen, also Kontrolle gegen diejenigen, um herauszufinden, was los ist, mit Bezug zu der Dokumentation für die Besonderheiten.

-2

Wenn die Datei geöffnet ist, schließen Sie sie, bevor Sie den Namen ändern. Der folgende Code funktioniert nicht und der Dateiname kann nicht geändert werden.

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

Warum beantworten Sie eine 2 Jahre alte Frage, die bereits eine akzeptierte Antwort hat und Ihre Antwort für das ursprüngliche Problem völlig irrelevant ist. –

0

Wenn Sie auf Linux sind, können Sie einfach String-Darstellung Fehler angezeigt werden nur nach tödlichen Anruf während in gdb umbenennen:

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)