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. 83、Tensorflow中的变量管理

    ''' Created on Apr 21, 2017 @author: P0079482 ''' #如何通过tf.variable_scope函数来控制tf.ger_variable函数获取已经创建 ...

  2. JAVA学习之面向对象

    面向对象是相对面向过程而言面向过程:强调的是功能行为面向对象:将功能封装进对象,强调具备了功能的对象 不论面向对象还是面向过程都是一种开发思想而已.举一个例子来理解面向对象和面向过程把大象装进冰箱分三 ...

  3. java 重新学习 (五)

    Set 集合 一.HashSet按照Hash算法存储集合元素(hashCode方法获取hashCode值,根据hashCode值获取元素位置,通过equals判断对象是否相等并且hashCode值是否 ...

  4. 实用maven笔记四-打包&其他

    通过使用maven的生命周期和丰富多样的插件,可以方便的将项目代码编译打包为自己需要的构件. maven默认项目主代码位置src/main/java目录,测试代码位置src/test/java目录.主 ...

  5. sudo 出现unable to resolve host hostname 解决方法

    Linux 环境,我的电脑叫枝桠(机器的hostname), 每次执行sudo 就出现这个警告讯息: sudo: unable to resolve host 枝桠 直接修改 /etc/hosts 的 ...

  6. 理解 Activity.runOnUiThread

    在开发 Android 应用的时候我们总是要记住应用主线程. 主线程非常繁忙,因为它要处理绘制UI,响应用户的交互,默认情况下执行我们写下的大部分代码. 好的开发者知道他/她需要将重负荷的任务移除到工 ...

  7. redis集群扩容(添加新节点)

    一.创建节点(接上文) 1.在H1服务器/root/soft目录下创建7002目录 2.将7001目录的配置文件redis.conf拷贝到7002,并修改配置文件的端口 3.进入 redis-5.0. ...

  8. Eclipse快速生成一个JavaBean类的方法

    原文: https://jingyan.baidu.com/article/948f5924156866d80ff5f921.html Eclipse快速生成一个JavaBean类的方法 听语音 | ...

  9. 通过lua进行nginx的权限控制

    nginx_lua的安装 nginx使用luajit进行编译安装 使用openresty进行yum安装 openresty中将lua和nginx进行封装,详情可查看openresty官网 openre ...

  10. ElasticSearch---初识

    1.概述 1.1 ElasticSearch是一个   基于Lucene   的  搜索服务器: 1.2 ElasticSearch 提供了一个分布式多用户能力的全文搜索引擎,基于  RESTful ...