『Golang』—— 标准库之 os
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的更多相关文章
- 『Golang』—— 标准库之 time
... package main import ( "fmt" "time" ) func main() { time.AfterFunc(time.Milli ...
- 『GoLang』string及其相关操作
目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...
- python常用标准库(os系统模块、shutil文件操作模块)
常用的标准库 系统模块 import os 系统模块用于对系统进行操作. 常用方法 os模块的常用方法有数十种之多,本文中只选出最常用的几种,其余的还有权限操作.文件的删除创建等详细资料可以参考官方文 ...
- 『GoLang』协程与通道
作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算)和程序的并发.程序可以在不同的处理器和计算机上同时执行不同的代码段.Go 语言为构建并发程序的基本代码块是 ...
- 『GoLang』反射
方法和类型的反射 反射是应用程序检查其所拥有的结构,尤其是类型的一种能.每种语言的反射模型都不同,并且有些语言根本不支持反射.Go语言实现了反射,反射机制就是在运行时动态调用对象的方法和属性,即可从运 ...
- 『GoLang』接口
接口是什么 Go 语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念. 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性.接口提供了一 ...
- 『Golang』跨平台TUI(基于文字的用户界面)库Terbox-Go文档翻译
原文 package termbox import "github.com/nsf/termbox-go" termbox-go 是一个用于创建跨平台TUI(基于文本的用户界面)的 ...
- 『Golang』Martini框架入门
本文介绍golang中的优秀web开发框架martini! 序 Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架.Martini是一个专门用来处理Web ...
- 『GoLang』fmt包的使用
目录 1. fmt 包初识 2. 格式化 verb 应用 2.1 通用 2.2 布尔值 2.3 整数 2.4 浮点数与复数 2.5 字符串和 []byte 2.6 指针 2.7 其他 flag 2.8 ...
随机推荐
- 【计算机网络mooc】一、概述
1.网络概述: 网络分成两个层级,用交换机连接的是子网,用路由器连接的是互连网. 互联网Internet是一个特定的互连网internet 发展3阶段,第3阶段:ISP,互联网服务提供商,缴纳费用获得 ...
- java8 Date LocalDate LocaDateTime 互相转化
java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...
- leetcode python翻转字符串里的单词
# Leetcode 151 翻转字符串里的单词### 题目描述给定一个字符串,逐个翻转字符串中的每个单词. **示例1:** 输入: "the sky is blue" 输出: ...
- docker内的服务无法获取用户真实IP
原文:blog.baohaipeng.top 背景:MySQL数据库和Redis运行在宿主机上(Linux),server运行在docker内,web运行在Nginx内(Nginx运行在docker内 ...
- webservice的使用-axis1-02
1.webservice传递javabean 自定义javabean必须是可序列化的 如果javabean中有内部类必须是静态的,因为只有静态的类才可以序列化 如果javabean中用到了其他的jav ...
- 线程池——Executors
一 Executor框架 为了更好地控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制.它们都在java.util.concurrent包中,是JDK并发包的核心.其 ...
- Python爬虫实战—— Request对象之header伪装策略
在header当中,我们经常会添加两个参数--cookie 和 User-Agent,来模拟浏览器登录,以此提高绕过后台服务器反爬策略的可能性. User-Agent获取 User-Agent可通过随 ...
- 关于nodejs+koa中的跨域问题与koa项目创建
项目快速创建 -1. 安装koa-generator npm install -g koa-generator -2. 使用koa-generator生成koa2项目, koa2 test -3. 完 ...
- SQL 更新
SQL UPDATE 语句(更新表中的记录) UPDATE 语句用于更新表中的现有记录. SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录. SQL UPDATE 语法 UPDA ...
- PHP ftp_nb_continue() 函数
定义和用法 ftp_nb_continue() 函数连续获取/发送文件.(无阻塞) 该函数返回下列值之一: FTP_FAILED(发送/获取失败) FTP_FINISHED(发送/获取成功) FTP_ ...