2015-02-14 8 views
6

Ich habe den folgenden Go-Code, der schließlich die Festplatte füllen und mit ENOSPC (nur ein Beweis des Konzepts) fehlschlagen wird. Wie kann ich aus der err von os.Write zurückgegeben, dass es in der Tat wegen ENOSPC fehlgeschlagen (so brauche ich eine Möglichkeit, nach der Schreiboperation errno greifen)?Errno nach einer Schreiboperation

package main 

import (
    "log" 
    "os" 
) 

func main() { 
    fd, _ := os.Create("dump.txt") 

    defer fd.Close() 

    for { 
     buf := make([]byte, 1024) 

     _, err := fd.Write(buf) 
     if err != nil { 
      log.Fatalf("%T %v", err, err) 
     } 
    } 
} 

EDIT: das Programm als @FUZxxl Aktualisiert vorgeschlagen:

package main 

import (
    "log" 
    "os" 
    "syscall" 
) 

func main() { 
    fd, _ := os.Create("dump.txt") 

    defer fd.Close() 

    for { 
     buf := make([]byte, 1024) 

     _, err := fd.Write(buf) 
     if err != nil { 

      log.Printf("%T %v\n", err, err) 
      errno, ok := err.(syscall.Errno) 

      if ok { 
       log.Println("type assert ok") 
       if errno == syscall.ENOSPC { 
        log.Println("got ENOSPC") 
       } 
      } else { 
       log.Println("type assert not ok") 
      } 
      break 
     } 
    } 
} 

Allerdings bin ich nicht das erwartete Ergebnis. Hier ist die Ausgabe:

2015/02/15 10:13:27 *os.PathError write dump.txt: no space left on device 
2015/02/15 10:13:27 type assert not ok 

Antwort

4

Dateioperationen im Allgemeinen zurück *os.PathError; Guss err-os.PathError und verwenden Sie die Err Feld die zugrunde liegende Ursache zu untersuchen, wie folgt aus:

patherr, ok := err.(*os.PathError) 
if ok && patherr.Err == syscall.ENOSPC { 
    log.Println("Out of disk space!") 
} 
+0

Ich dachte eigentlich, das funktionieren würde, aber es scheint 'err' kann nicht in' syscall.Errno' umgewandelt werden :(Siehe meine aktualisierte Frage – Unknown

+0

@Unknown Das ist komisch Kannst du mir sagen was 'fmt.Printf ("% T ", err)' sagt? Auf welcher Plattform bist du? – fuz

+0

Du kannst es in der obigen Ausgabe sehen, 'err' ist ein '* os.PathError'. Ich bin auf Linux amd64. – Unknown