2014-05-04 5 views
5

Wenn ich ioutil verwenden, um eine Datei zu lesen, kann es einen Fehler zurückgeben. Aber wenn ich einen Fehlercode filtern möchte, was soll ich tun?Wie kann ich nach bestimmten Fehlertypen unter den von ioutil.ReadFile zurückgegebenen Fehlern suchen?

res, err := ioutil.ReadFile("xxx") 
if err != nil { 
    fmt.Println(err.Error()) 
} 
... 

Im Codeausschnitt oben, wenn eine Datei keine Berechtigung hat, wird fmt.Println(err.Error())"open xxxxx: permission denied drucken. Wenn ich diesen Fehler erfassen möchte, wie kann ich wissen, dass das Lesen der Datei fehlgeschlagen ist, weil die Berechtigung verweigert wurde?

Sollte ich suchen err.Error() für die Zeichenfolge permission denied - das sieht nicht gut aus. Gibt es einen besseren Weg?

Vielen Dank im Voraus.

aktualisieren

Nach @Intermernet Lösung versucht, fand ich, dass es nicht case os.ErrPermission getroffen wird, es default und Druck "open xxx: Permission denied" treffen wird.

@Aedolon Lösung ist in Ordnung, os.IsPermission(err) kann sagen, dass eine Datei mit der Berechtigung verweigert wurde.

Antwort

8

Nach der aktuellen API, hat ioutil.ReadFile kein spezifisches Verhalten garantieren, außer dass es err == nil zurück, wenn erfolgreich. Auch das syscall-Paket garantiert keinen konkreten Fehler.

Die aktuelle Implementierung von ioutil.ReadFile verwendet os.Open, die *os.PathError zurückkehren wird, wenn eine Datei zu öffnen versagt, nicht os.ErrPermission oder irgendetwas anderes. os.PathError enthält ein Feld Err, das ist auch ein Fehler - in diesem Fall eine syscall.Errno. Die Zeichenfolge "permission denied" wird aus einer privaten Tabelle mit Fehlernachrichten erstellt und ist Architektur und implementierungsspezifisch. In meinem Windows-Rechner heißt es stattdessen "Zugang verweigert".

AFAIK, die korrekte Methode ist die Verwendung os.IsPermission(err), die true im Falle fehlender Berechtigungen zurückgibt.

2

ioutil.ReadFile() ruft os.Open() auf und gibt alle dort aufgetretenen Fehler zurück.

Die os package definiert einige file related errors.

ErrInvalid = errors.New ("ungültig Argument")
ErrPermission = errors.New ("Zugriff verweigert")
ErrExist = errors.New ("Datei bereits vorhanden ist")
ErrNotExist = Fehler. Neu ("Datei existiert nicht")

Der, nach dem Sie suchen, ist os.ErrPermission.

res, err := ioutil.ReadFile("xxx") 
if err != nil { 
    switch err { 
    case os.ErrInvalid: 
     //Do stuff 
    case os.ErrPermission: 
     //Do stuff 
    case os.ErrNotExist: 
     //Do stuff 
    default: 
     fmt.Println(err) 
    } 
} 
+0

Ich habe festgestellt, dass es nicht trifft ** case os.ErrPermission **, es wird ** ** ** ** drücken und print '" open xxx: Permission denied "' –

Verwandte Themen