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. HTTP超详细总结

    HTTP协议概述 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...

  2. 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表

    目录 目录 前文列表 扩展阅读 定义数据模型 models 创建表 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 ...

  3. Jenkins 搭建篇

    1.Jenkins 介绍 自动化运维工具:saltstack.jenkins.等.因为他们的目标一样,为了我们的软件.构建.测试.发布更加的敏捷.频繁.可靠 如果运维对git不熟,是无法做自动化部署. ...

  4. Config JAVA evironment for LoadRunner

    1. Install jdk 2. Set system variables eg. JAVA_HOME = C:\Program Files (x86)\Java\jdk1.6.0_43 class ...

  5. 开发效率优化之Git分布式版本控制系统(一)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...

  6. Pytest参数传递

    import pytest@pytest.fixture()def login_r(open_browser):#调用login时,发现需要先打开浏览器,所以改成先打开浏览器,在登陆 print('输 ...

  7. tar 和gzip 的区别

    首先要 弄清两个概念:打包和压缩. 打包是指将一大堆文件或目录什么的变成一个总的文件, 压缩则是将一个大的文件通过一些压缩算法变成一个小文件. 为什么要区分这两个概念呢?其实这源于Linux中的很多压 ...

  8. Apache启动后出现You don't have permission to access on this server的解决办法

    安装好wampserver想在浏览器打开运行php的结果,发现: You don't have permission to access on this server 解决办法是: 在Apache的根 ...

  9. KiCAD泪滴

    KiCAD泪滴 KiCAD没有自带的补泪滴功能,必须先下载一个插件,然后才能进行泪滴操作 链接 提取码:ey8o 1.下载泪滴插件,解压后将整个文件夹复制到目录  C:\Program Files\K ...

  10. 【JS学习】慕课网4-10 编程练习

    在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名.性别.年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦. 学生信息如下: ('小 ...