package starainrt import ( "errors" "fmt" "io" "os" "time" ) var HttpNul, HttpNul2 map[string]string var HttpTimeOut int64 = 15 var ShellRes, ShellErr string var ShellExit bool type CircleByteBuffer struct { io.Reader io.Writer io.Closer datas []byte start int end int size int isClose bool isEnd bool } func NewCircleByteBuffer(len int) *CircleByteBuffer { var e = new(CircleByteBuffer) e.datas = make([]byte, len) e.start = 0 e.end = 0 e.size = len e.isClose = false e.isEnd = false return e } // Exists 返回指定文件夹/文件是否存在 func Exists(filepath string) bool { _, err := os.Stat(filepath) if err != nil && os.IsNotExist(err) { return false } return true } // IsFile 返回给定文件地址是否是一个文件, //True为是一个文件,False为不是文件或路径无效 func IsFile(fpath string) bool { s, err := os.Stat(fpath) if err != nil { return false } return !s.IsDir() } // IsFolder 返回给定文件地址是否是一个文件夹, //True为是一个文件夹,False为不是文件夹或路径无效 func IsFolder(fpath string) bool { s, err := os.Stat(fpath) if err != nil { return false } return s.IsDir() } func (e *CircleByteBuffer) getLen() int { if e.start == e.end { return 0 } else if e.start < e.end { return e.end - e.start } else { return e.start - e.end } } func (e *CircleByteBuffer) getFree() int { return e.size - e.getLen() } func (e *CircleByteBuffer) putByte(b byte) error { if e.isClose { return io.EOF } e.datas[e.end] = b var pos = e.end + 1 for pos == e.start { if e.isClose { return io.EOF } time.Sleep(time.Microsecond) } if pos == e.size { e.end = 0 } else { e.end = pos } return nil } func (e *CircleByteBuffer) getByte() (byte, error) { if e.isClose { return 0, io.EOF } if e.isEnd && e.getLen() <= 0 { return 0, io.EOF } if e.getLen() <= 0 { return 0, errors.New("no datas") } var ret = e.datas[e.start] e.start++ if e.start == e.size { e.start = 0 } return ret, nil } func (e *CircleByteBuffer) geti(i int) byte { if i >= e.getLen() { panic("out buffer") } var pos = e.start + i if pos >= e.size { pos -= e.size } return e.datas[pos] } /*func (e*CircleByteBuffer)puts(bts []byte){ for i:=0;i