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

path 库:

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

os 库:

 package main

 import "os"
import "os/exec" import "time"
import "fmt"
import "log"
import "errors" // const (// {{{
// O_RDONLY int = syscall.O_RDONLY // open the file read-only.
// O_WRONLY int = syscall.O_WRONLY // open the file write-only.
// O_RDWR int = syscall.O_RDWR // open the file read-write.
// O_APPEND int = syscall.O_APPEND // append data to the file when writing.
// O_CREATE int = syscall.O_CREAT // create a new file if none exists.
// O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist
// O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
// O_TRUNC int = syscall.O_TRUNC // if possible, truncate file when opened.
// )
//
// var (
// Stdin = newfile(uintptr(syscall.Stdin), "/dev/stdin")
// Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
// Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
// )
// }}}
const (
Unknown int = -
Dir int =
Regular int =
Symlink int =
Socket int =
NamedPipe int =
) var (
path string = "/tmp/link_to_testfile"
err error
) func main() {
defer defer_printBye() cwd, _ := os.Getwd()
fmt.Println("Work dir:", cwd)
os.Chdir("/tmp")
cwd, _ = os.Getwd()
fmt.Println("New work dir:", cwd) hostname, _ := os.Hostname()
pagesize := os.Getpagesize()
fmt.Printf("hostname = %s\npagesize = %d\n", hostname, pagesize) if nil != os.Setenv("HISTSIZE", "") {
log.Fatal("Can't set env HISTSIZE")
} fmt.Println(os.Getenv("HISTSIZE"))
os.Unsetenv("HISTSIZE")
fmt.Println("After Unsetenv:", os.Getenv("HISTSIZE")) //for _, env := range os.Environ() {
// fmt.Println(env)
//} os.Clearenv()
fmt.Println("Env variables after os.Clearenv: ", os.Environ()) groups, _ := os.Getgroups()
fmt.Println("groups IDs:", groups)
fmt.Println("uid:", os.Getuid(), "euid:", os.Geteuid(), "gid:", os.Getgid(), "egid:", os.Getegid(), "pid:", os.Getpid(), "ppid:", os.Getppid())
// {{{
/*
type FileInfo interface {
Name() string // base name of the file
Size() int64 // length in bytes for regular files; system-dependent for others
Mode() FileMode // file mode bits
ModTime() time.Time // modification time
IsDir() bool // abbreviation for Mode().IsDir()
Sys() interface{} // underlying data source (can return nil)
} const (
// The single letters are the abbreviations used by the String method's formatting.
ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
ModeAppend // a: append-only
ModeExclusive // l: exclusive use
ModeTemporary // T: temporary file (not backed up)
ModeSymlink // L: symbolic link
ModeDevice // D: device file
ModeNamedPipe // p: named pipe (FIFO)
ModeSocket // S: Unix domain socket
ModeSetuid // u: setuid
ModeSetgid // g: setgid
ModeCharDevice // c: Unix character device, when ModeDevice is set
ModeSticky // t: sticky // Mask for the type bits. For regular files, none will be set.
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice ModePerm FileMode = 0777 // Unix permission bits
)
*/ // }}} ftype, fm := file_info(path)
fmt.Println("File type is:", file_type_string(ftype)) fmt.Printf("permission: %s, %b\n", fm.String(), fm.Perm())
fm = fm &
os.Chmod(path, fm)
fmt.Printf("After os.Chmod, permission: %s, %b\n", fm.String(), fm.Perm()) err = os.Chown(path, , -)
print_err("Change owner to 1000/-1 failed!")
err = os.Lchown(path, , )
print_err("Change owner to 0/0 failed!")
os.Link(path, "tempfile_new")
os.Symlink(path, "tempfile_new_symlink")
os.Mkdir("/tmp/tempfile_dir", )
os.MkdirAll("/tmp/tempfile_dir_All/teem", ) out, _ := exec.Command("/bin/ls", "/tmp").Output()
fmt.Printf("%s", out)
fmt.Println() os.Rename("/tmp/tempfile_dir", "/tmp/tempfiledir")
os.Remove("/tmp/tempfiledir")
os.RemoveAll("/tmp/tempfile_dir_All")
fmt.Println("Delete all tmp files") out, _ = exec.Command("/bin/ls", "/tmp").Output()
fmt.Printf("%s", out)
fmt.Println() realname, _ := os.Readlink(path)
tmp0, _ := os.Stat(realname)
tmp1, _ := os.Stat(path)
if os.SameFile(tmp0, tmp1) {
fmt.Println("SameFile")
}
os.Truncate(path, )
fi, _ := os.Stat(path)
fmt.Println("New file size is:", fi.Size()) // type File struct {// {{{
// *file // os specific
// }
// }}}
fp, er := os.OpenFile("/tmp/xxxmyfile", os.O_CREATE|os.O_RDWR|os.O_TRUNC, )
err = er
print_err("Create /tmp/xxxmyfile failed!")
fp.Close()
os.Mkdir("/tmp/test", )
fp, _ = os.Open("/tmp/test")
fp.Chdir()
cwd, _ = os.Getwd()
fmt.Printf("Current dir:%s \n", cwd)
fp.Chmod()
fp.Chown(-, -)
fmt.Printf("%p, %s\n", fp.Fd(), fp.Name())
fr, fw, _ := os.Pipe()
in := []byte("aljkdflajs;lfjalsjfoawjlfkjaslkjflkashglhaklsjfjalsjfklasjklf") out = make([]byte, ) go gofn(fw, in) fr.Read(out)
fmt.Println(string(out)) go func() {
fw.WriteString("--------------------------------------------------------------")
fr.Read(out)
fmt.Println(string(out))
}() dirname, _ := fp.Readdirnames(-)
for _, yy := range dirname {
fmt.Printf("--------%s\n", yy)
} fp.Seek(, ) fii, _ := fp.Readdir(-)
for _, xx := range fii {
fmt.Printf("+++++++%s\n", xx.Name())
} // type Process struct {// {{{
// Pid int
// }
//
// type ProcAttr struct {
// Dir string
// Env []string
// Files []*File
// Sys *syscall.SysProcAttr
// }
//
// type ProcessState struct {}
// }}} pattr := os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}}
cmd := []string{"", "/tmp"} var ps *os.Process
go func() {
ps, _ = os.StartProcess("/bin/ls", cmd, &pattr)
}() go func() {
fmt.Println("Sleeping...3s...")
time.Sleep(time.Second * ) ps.Kill()
ps.Signal(os.Interrupt) }() fmt.Println("Sleeping...3s...")
time.Sleep(time.Second * ) procstat, _ := ps.Wait()
fmt.Println(procstat.String(), procstat.Exited(), procstat.Pid(), procstat.SystemTime(), procstat.UserTime()) fp.Close()
} func defer_printBye() {
fmt.Println("Bye, thanks for CPU time")
} func print_err(info string) {
if nil != err {
fmt.Fprintln(os.Stderr, errors.New(info))
}
} func file_info(path string) (int, os.FileMode) {
var ftype int
var fm os.FileMode fi, err := os.Lstat(path)
if nil != err {
switch {
case os.IsNotExist(err):
print_err("IsNotExist")
case os.IsPermission(err):
print_err("IsPermission")
default:
print_err("Unknown errors")
break
}
os.Exit()
} else {
switch fm = fi.Mode(); {
case fm.IsDir():
ftype = Dir
case fm&os.ModeSymlink != :
ftype = Symlink
case fm.IsRegular():
ftype = Regular
case fm&os.ModeSocket != :
ftype = Socket
case fm&os.ModeNamedPipe != :
ftype = NamedPipe
default:
ftype = Unknown
}
}
return ftype, fm
} func file_type_string(ftype int) string {
var res string
switch ftype {
case Dir:
res = "Dir"
case Regular:
res = "Regular"
case Socket:
res = "Socket"
case NamedPipe:
res = "NamedPipe"
case Unknown:
res = "Unknown"
default:
res = "Symlink"
}
return res
} func gofn(fw *os.File, in []byte) {
num, _ := fw.Write(in)
if num != len(in) {
print_err("write failed")
}

...

『Golang』—— 标准库之 os的更多相关文章

  1. 『Golang』—— 标准库之 time

    ... package main import ( "fmt" "time" ) func main() { time.AfterFunc(time.Milli ...

  2. 『GoLang』string及其相关操作

    目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...

  3. python常用标准库(os系统模块、shutil文件操作模块)

    常用的标准库 系统模块 import os 系统模块用于对系统进行操作. 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作.文件的删除创建等详细资料可以参考官方文 ...

  4. 『GoLang』协程与通道

    作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算)和程序的并发.程序可以在不同的处理器和计算机上同时执行不同的代码段.Go 语言为构建并发程序的基本代码块是 ...

  5. 『GoLang』反射

    方法和类型的反射 反射是应用程序检查其所拥有的结构,尤其是类型的一种能.每种语言的反射模型都不同,并且有些语言根本不支持反射.Go语言实现了反射,反射机制就是在运行时动态调用对象的方法和属性,即可从运 ...

  6. 『GoLang』接口

    接口是什么 Go 语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念. 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性.接口提供了一 ...

  7. 『Golang』跨平台TUI(基于文字的用户界面)库Terbox-Go文档翻译

    原文 package termbox import "github.com/nsf/termbox-go" termbox-go 是一个用于创建跨平台TUI(基于文本的用户界面)的 ...

  8. 『Golang』Martini框架入门

    本文介绍golang中的优秀web开发框架martini! 序 Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架.Martini是一个专门用来处理Web ...

  9. 『GoLang』fmt包的使用

    目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...

随机推荐

  1. 《Java技术》 第二次作业

    java第二次作业 (一)学习总结 1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法.举例说明equals方法和==的区别. 在Eclips ...

  2. Windows IO System

    Windows IO System是由一些executive components组成,这些component可以认为是ntoskrnl.exe中相对独立的一些module. 整个IO System是 ...

  3. 11-vim-撤销和删除命令-01-撤销

    撤销和恢复撤销 命令 英文 功能 u undo 撤销上一次命令 ctrl  u redo 恢复撤销的命令

  4. Codeforces 490D Chocolate

    D. Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  5. TOPO DN 解析

    介绍     有一个算法,是将大量TOPO DN实例解析成结构形式.并依据DN获取对应的数据.本人感觉值得分享.并供大家讨论与优化.     注意:TOPO DN实例的顺序,是被我的其他算法预处理过的 ...

  6. iView + vue-quill-editor 实现一个富文本编辑器(包含图片,视频上传)

    1. 引入插件(注意IE10以下不支持) npm install vue-quill-editor --savenpm install quill --save (Vue-Quill-Editor需要 ...

  7. web服务器和应用服务器以及web应用框架介绍

    ### web服务器:负责处理http请求,响应静态文件,常见的有Apache,Nginx以及微软的IIS. ### 应用服务器:负责处理逻辑的服务器.比如php.python的代码,是不能直接通过n ...

  8. stat - 打印信息节点(inode)内容

    SYNOPSIS(总览) stat filename [filenames ... ] DESCRIPTION(描述) stat 打印出一个信息节点的内容,它们显示为对人可读的格式的stat(2). ...

  9. dill:解决python的“AttributeError: Can't pickle local object”及无法pickle lambda函数的问题

    python的pickle是用来序列化对象很方便的工具,但是pickle对传入对象的要求是不能是内部类,也不能是lambda函数. 比如尝试pickle这个内部类: 结果会报错AttributeErr ...

  10. Thunar 右键菜单等自定义

    Thunar 右键菜单等自定义 可以使用图形界面或者直接编辑配置文件,二者是等价的. 图形界面: 以给"zip,rar,7z"等文件添加"在此位置使用unar解压缩&qu ...