• 『Golang』—— 标准库之 os


    Golang 的 os 库基本承袭 Unix 下 C 语言的用法

    path 库:

    func Base(path string) string    //取文件名,不含目录部分
    func Dir(path string) string    //取路径中的目录名部分,不含文件名
    func Join(elem ...string) string    //拼接字段,中间自动添加 ‘/’

    os 库:

      1 package main
      2 
      3 import "os"
      4 import "os/exec"
      5 
      6 import "time"
      7 import "fmt"
      8 import "log"
      9 import "errors"
     10 
     11 //    const (// {{{
     12 //        O_RDONLY int = syscall.O_RDONLY // open the file read-only.
     13 //        O_WRONLY int = syscall.O_WRONLY // open the file write-only.
     14 //        O_RDWR   int = syscall.O_RDWR   // open the file read-write.
     15 //        O_APPEND int = syscall.O_APPEND // append data to the file when writing.
     16 //        O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
     17 //        O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist
     18 //        O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.
     19 //        O_TRUNC  int = syscall.O_TRUNC  // if possible, truncate file when opened.
     20 //    )
     21 //
     22 //    var (
     23 //        Stdin  = newfile(uintptr(syscall.Stdin), "/dev/stdin")
     24 //        Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
     25 //        Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
     26 //    )
     27 // }}}
     28 const (
     29     Unknown   int = -1
     30     Dir       int = 0
     31     Regular   int = 1
     32     Symlink   int = 2
     33     Socket    int = 3
     34     NamedPipe int = 4
     35 )
     36 
     37 var (
     38     path string = "/tmp/link_to_testfile"
     39     err  error
     40 )
     41 
     42 func main() {
     43     defer defer_printBye()
     44 
     45     cwd, _ := os.Getwd()
     46     fmt.Println("Work dir:", cwd)
     47     os.Chdir("/tmp")
     48     cwd, _ = os.Getwd()
     49     fmt.Println("New work dir:", cwd)
     50 
     51     hostname, _ := os.Hostname()
     52     pagesize := os.Getpagesize()
     53     fmt.Printf("hostname = %s
    pagesize = %d
    ", hostname, pagesize)
     54 
     55     if nil != os.Setenv("HISTSIZE", "1000") {
     56         log.Fatal("Can't set env HISTSIZE")
     57     }
     58 
     59     fmt.Println(os.Getenv("HISTSIZE"))
     60     os.Unsetenv("HISTSIZE")
     61     fmt.Println("After Unsetenv:", os.Getenv("HISTSIZE"))
     62 
     63     //for _, env := range os.Environ() {
     64     //    fmt.Println(env)
     65     //}
     66 
     67     os.Clearenv()
     68     fmt.Println("Env variables after os.Clearenv: ", os.Environ())
     69 
     70     groups, _ := os.Getgroups()
     71     fmt.Println("groups IDs:", groups)
     72     fmt.Println("uid:", os.Getuid(), "euid:", os.Geteuid(), "gid:", os.Getgid(), "egid:", os.Getegid(), "pid:", os.Getpid(), "ppid:", os.Getppid())
     73     // {{{
     74     /*
     75         type FileInfo interface {
     76               Name() string       // base name of the file
     77               Size() int64        // length in bytes for regular files; system-dependent for others
     78               Mode() FileMode     // file mode bits
     79               ModTime() time.Time // modification time
     80               IsDir() bool        // abbreviation for Mode().IsDir()
     81               Sys() interface{}   // underlying data source (can return nil)
     82         }
     83 
     84         const (
     85                 // The single letters are the abbreviations used by the String method's formatting.
     86                 ModeDir        FileMode = 1 << (32 - 1 - iota) // d: is a directory
     87                 ModeAppend                                     // a: append-only
     88                 ModeExclusive                                  // l: exclusive use
     89                 ModeTemporary                                  // T: temporary file (not backed up)
     90                 ModeSymlink                                    // L: symbolic link
     91                 ModeDevice                                     // D: device file
     92                 ModeNamedPipe                                  // p: named pipe (FIFO)
     93                 ModeSocket                                     // S: Unix domain socket
     94                 ModeSetuid                                     // u: setuid
     95                 ModeSetgid                                     // g: setgid
     96                 ModeCharDevice                                 // c: Unix character device, when ModeDevice is set
     97                 ModeSticky                                     // t: sticky
     98 
     99                 // Mask for the type bits. For regular files, none will be set.
    100                 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
    101 
    102                 ModePerm FileMode = 0777 // Unix permission bits
    103         )
    104     */ // }}}
    105 
    106     ftype, fm := file_info(path)
    107     fmt.Println("File type is:", file_type_string(ftype))
    108 
    109     fmt.Printf("permission: %s, %b
    ", fm.String(), fm.Perm())
    110     fm = fm & 0400
    111     os.Chmod(path, fm)
    112     fmt.Printf("After os.Chmod, permission: %s, %b
    ", fm.String(), fm.Perm())
    113 
    114     err = os.Chown(path, 1000, -1)
    115     print_err("Change owner to 1000/-1 failed!")
    116     err = os.Lchown(path, 0, 0)
    117     print_err("Change owner to 0/0 failed!")
    118     os.Link(path, "tempfile_new")
    119     os.Symlink(path, "tempfile_new_symlink")
    120     os.Mkdir("/tmp/tempfile_dir", 0755)
    121     os.MkdirAll("/tmp/tempfile_dir_All/teem", 0755)
    122 
    123     out, _ := exec.Command("/bin/ls", "/tmp").Output()
    124     fmt.Printf("%s", out)
    125     fmt.Println()
    126 
    127     os.Rename("/tmp/tempfile_dir", "/tmp/tempfiledir")
    128     os.Remove("/tmp/tempfiledir")
    129     os.RemoveAll("/tmp/tempfile_dir_All")
    130     fmt.Println("Delete all tmp files")
    131 
    132     out, _ = exec.Command("/bin/ls", "/tmp").Output()
    133     fmt.Printf("%s", out)
    134     fmt.Println()
    135 
    136     realname, _ := os.Readlink(path)
    137     tmp0, _ := os.Stat(realname)
    138     tmp1, _ := os.Stat(path)
    139     if os.SameFile(tmp0, tmp1) {
    140         fmt.Println("SameFile")
    141     }
    142     os.Truncate(path, 1024)
    143     fi, _ := os.Stat(path)
    144     fmt.Println("New file size is:", fi.Size())
    145 
    146     //    type File struct {// {{{
    147     //        *file // os specific
    148     //    }
    149     // }}}
    150     fp, er := os.OpenFile("/tmp/xxxmyfile", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0644)
    151     err = er
    152     print_err("Create /tmp/xxxmyfile failed!")
    153     fp.Close()
    154     os.Mkdir("/tmp/test", 0700)
    155     fp, _ = os.Open("/tmp/test")
    156     fp.Chdir()
    157     cwd, _ = os.Getwd()
    158     fmt.Printf("Current dir:%s 
    ", cwd)
    159     fp.Chmod(0700)
    160     fp.Chown(-1, -1)
    161     fmt.Printf("%p, %s
    ", fp.Fd(), fp.Name())
    162     fr, fw, _ := os.Pipe()
    163     in := []byte("aljkdflajs;lfjalsjfoawjlfkjaslkjflkashglhaklsjfjalsjfklasjklf")
    164 
    165     out = make([]byte, 100)
    166 
    167     go gofn(fw, in)
    168 
    169     fr.Read(out)
    170     fmt.Println(string(out))
    171 
    172     go func() {
    173         fw.WriteString("--------------------------------------------------------------")
    174         fr.Read(out)
    175         fmt.Println(string(out))
    176     }()
    177 
    178     dirname, _ := fp.Readdirnames(-1)
    179     for _, yy := range dirname {
    180         fmt.Printf("--------%s
    ", yy)
    181     }
    182 
    183     fp.Seek(0, 0)
    184 
    185     fii, _ := fp.Readdir(-1)
    186     for _, xx := range fii {
    187         fmt.Printf("+++++++%s
    ", xx.Name())
    188     }
    189 
    190     //    type Process struct {// {{{
    191     //        Pid int
    192     //    }
    193     //
    194     //    type ProcAttr struct {
    195     //        Dir string
    196     //        Env []string
    197     //        Files []*File
    198     //        Sys *syscall.SysProcAttr
    199     //    }
    200     //
    201     //    type ProcessState struct {}
    202     // }}}
    203 
    204     pattr := os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}}
    205     cmd := []string{"", "/tmp"}
    206 
    207     var ps *os.Process
    208     go func() {
    209         ps, _ = os.StartProcess("/bin/ls", cmd, &pattr)
    210     }()
    211 
    212     go func() {
    213         fmt.Println("Sleeping...3s...")
    214         time.Sleep(time.Second * 3)
    215 
    216         ps.Kill()
    217         ps.Signal(os.Interrupt)
    218 
    219     }()
    220 
    221     fmt.Println("Sleeping...3s...")
    222     time.Sleep(time.Second * 3)
    223 
    224     procstat, _ := ps.Wait()
    225     fmt.Println(procstat.String(), procstat.Exited(), procstat.Pid(), procstat.SystemTime(), procstat.UserTime())
    226 
    227     fp.Close()
    228 }
    229 
    230 func defer_printBye() {
    231     fmt.Println("Bye, thanks for CPU time")
    232 }
    233 
    234 func print_err(info string) {
    235     if nil != err {
    236         fmt.Fprintln(os.Stderr, errors.New(info))
    237     }
    238 }
    239 
    240 func file_info(path string) (int, os.FileMode) {
    241     var ftype int
    242     var fm os.FileMode
    243 
    244     fi, err := os.Lstat(path)
    245     if nil != err {
    246         switch {
    247         case os.IsNotExist(err):
    248             print_err("IsNotExist")
    249         case os.IsPermission(err):
    250             print_err("IsPermission")
    251         default:
    252             print_err("Unknown errors")
    253             break
    254         }
    255         os.Exit(1)
    256     } else {
    257         switch fm = fi.Mode(); {
    258         case fm.IsDir():
    259             ftype = Dir
    260         case fm&os.ModeSymlink != 0:
    261             ftype = Symlink
    262         case fm.IsRegular():
    263             ftype = Regular
    264         case fm&os.ModeSocket != 0:
    265             ftype = Socket
    266         case fm&os.ModeNamedPipe != 0:
    267             ftype = NamedPipe
    268         default:
    269             ftype = Unknown
    270         }
    271     }
    272     return ftype, fm
    273 }
    274 
    275 func file_type_string(ftype int) string {
    276     var res string
    277     switch ftype {
    278     case Dir:
    279         res = "Dir"
    280     case Regular:
    281         res = "Regular"
    282     case Socket:
    283         res = "Socket"
    284     case NamedPipe:
    285         res = "NamedPipe"
    286     case Unknown:
    287         res = "Unknown"
    288     default:
    289         res = "Symlink"
    290     }
    291     return res
    292 }
    293 
    294 func gofn(fw *os.File, in []byte) {
    295     num, _ := fw.Write(in)
    296     if num != len(in) {
    297         print_err("write failed")
    298     }
    299

    ...

  • 相关阅读:
    sosex !mk
    使用boost iostream写文件
    编译ios版本的ffmpeg0.11.1
    转换日期为中文数字
    sosex !muf查看方法的反汇编代码
    Xcode 4.5.2 + iOS 6.0免证书(iDP)开发+真机调试+生成IPA全攻略
    sosex查看变量的命令!mdt
    vs2012编译openssl
    为ios编译openssl
    打开的页面关闭后刷新主页面
  • 原文地址:https://www.cnblogs.com/hadex/p/6680830.html
Copyright © 2020-2023  润新知