2012-09-06 7 views
6

ja pomocą funkcji C++ stdio.h wzmiana nazwy() zwraca -1. Jak się dowiedzieć, dlaczego zmiana nazwy kończy się niepowodzeniem?

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

zmiany nazwy() zmiany nazwy zawartość, ale czasami nie udaje zmiany nazwy pliku i powraca 1.

Czy jest jakiś sposób, aby wiedzieć, dlaczego rename() nie działa?
jakikolwiek sposób poznać to wyjaśnienie błędu za pomocą dowolnej funkcji C++.

+6

Sprawdź zmienną errno' '. Użyj np. ['strerror'] (http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx), aby uzyskać ciąg do drukowania. –

Odpowiedz

9

Powinno być możliwe, aby uzyskać konkretny błąd z errno.h

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

Zwracany błędy prawdopodobnie są OS-specyficzny. http://linux.die.net/man/3/rename pokazuje, co zwykle można uzyskać, korzystając z Linuksa.

2

rename ustawi zmienną globalną _errno z ostatnim numerem błędu, sprawdź to.

+2

Należy zauważyć, że podkreśleniem jest dziwny Microsoftism. W standardowym języku C++ nosi nazwę 'errno'. –

2

Sprawdź wartość _errno. To może być jeden z nich:

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

funkcje API C, jak to zwykle ustawione errno kiedy nie dać więcej informacji. Dokumentacja zwykle zawiera informacje o wartościach, które może ustawić, i istnieje również funkcja o nazwie strerror(), która będzie miała wartość errno i zwróci komunikat char * z komunikatem o błędzie możliwym do odczytania przez człowieka.

Aby to uzyskać, być może trzeba dołączyć <errno.h>.

W odniesieniu do rename() w MFC, byłoby to wydaje się być dokumentacja do niego: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx który mówi, że ustawia errno do EACCES, ENOENT lub EINVAL w różnych warunkach, więc sprawdź przed tymi, aby dowiedzieć się, co się dzieje, z odniesieniem do dokumentacji dla specyfiki.

-2

jeśli plik jest otwarty, proszę zamknąć go przed zmianą nazwy. Poniższy kod nie zadziała, a nazwy pliku nie można zmienić.

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

Po co odpowiadać na 2-letnie pytanie, które już ma zaakceptowaną odpowiedź, a twoja odpowiedź jest zupełnie nieistotna dla pierwotnego problemu. –

0

Jeśli jesteś na Linuksie można po prostu wyświetlić reprezentację ciąg błędu tuż po fatalnym wezwanie do zmiany nazwy chwilę w 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)