通过os.Stat获取文件信息
err==nil的时候,文件肯定是存在的;其次err!=nil的时候也不代表不存在
package main
import (
"fmt"
"os"
)
type FileAttributes struct {
FileSize int64
FileName string
}
func Readf1le(host *FileAttributes, FilePath string) {
file, err := os.Stat(FilePath)
if err == nil {
fmt.Println("File Exist")
host.FileName = file.Name()
host.FileSize = file.Size()
} else {
fmt.Println("Fileinfo err")
}
}
func main() {
FilePath := os.Args[1]
fmt.Println(FilePath)
var Book FileAttributes
Readf1le(&Book, FilePath)
fmt.Println(Book.FileName, Book.FileSize)
}
读取字典
func Readf1le(FilePath string) ([]string, error) {
file, err := os.Open(FilePath)
if err != nil {
return nil, err
}
defer file.Close()
reader := bufio.NewReader(file)
scanner := bufio.NewScanner(reader)//可省略bufio.NewReader,直接bufio.NewScanner(file)
//ScanLines按行分割读取,ScanBytes:内容单个字节返回,ScanWords:将按空格或者换行符区分,ScanRunes:按字返回,多字节(中文)不会乱码
scanner.Split(bufio.ScanLines)
var result []string
for scanner.Scan() { //Scanner.Scan方法默认是以换行符\n分割
passwd := strings.TrimSpace(scanner.Text())//string.TrimSpace类似Python strip(),去除字符串左右两边的\n \t \r 空白等
if passwd != "" {
result = append(result, passwd)
}
}
return result, err
}
func main() {
FilePath := os.Args[1]
passwds, err := Readf1le(FilePath)
if err != nil {
fmt.Println(err)
}
//fmt.Println("'" + passwds[1] + "'")
fmt.Println(passwds)
}
或者直接通过bufio.NewReader的ReadString读取
func Readf1le(FilePath string) ([]string, error) {
file, err := os.Open(FilePath)
if err != nil {
return nil, err
}
defer file.Close()
reader := bufio.NewReader(file)
var result []string
for {
line, err := reader.ReadString('\n')
line = strings.TrimSpace(line)
if line != "" {
result = append(result, line)
}
if err != nil {
if err == io.EOF {
break
}
return nil, err
}
}
return result, err
}
func main() {
FilePath := os.Args[1]
passwds, err := Readf1le(FilePath)
if err != nil {
fmt.Println(err)
}
fmt.Println(len(passwds))
fmt.Println("'" + passwds[4] + "'")
//fmt.Println(passwds[1])
}
为什么NewReader可以将*File作为参数呢,解释看下图
流处理
func ReadFile(filePath string, handle func(string)) error {
f, err := os.Open(filePath)
defer f.Close()
if err != nil {
return err
}
buf := bufio.NewReader(f)
for {
line, err := buf.ReadLine("\n")
line = strings.TrimSpace(line)
handle(line)
if err != nil {
if err == io.EOF{
return nil
}
return err
}
return nil
}
}
分片处理
适合二进制文件
func ReadBigFile(fileName string, handle func([]byte)) error {
f, err := os.Open(fileName)
if err != nil {
fmt.Println("can't opened this file")
return err
}
defer f.Close()
s := make([]byte, 4096)
for {
switch nr, err := f.Read(s[:]); true {
case nr < 0:
fmt.Fprintf(os.Stderr, "cat: error reading: %s\n
创建并且写入文件
func WriteFile(path string) {
//打开文件,新建文件
f, err := os.Create(path)
if err != nil {
fmt.Println("err = ", err)
return
}
//使用完毕,需要关闭文件
defer f.Close()
var buf string
for i := 0; i < 10; i++ {
//"i = 1\n", 这个字符串存储在buf中
buf = fmt.Sprintf("i = %d\n", i)
//fmt.Println("buf = ", buf)
n, err := f.WriteString(buf)
if err != nil {
fmt.Println("err = ", err)
}
fmt.Println("n = ", n)
}
}