实现php file_get_contents,file_put_contents 函数
package php
import (
"errors"
"os"
"strings"
"sync"
)
var mu sync.Mutex
//UnSupportProtocols 暂时不支持的协议类型
var UnSupportProtocols = []string{
"http://",
"ftp://",
"zlib://",
"ssh2://",
}
//SupportProtocols 支持的协议类型
var SupportProtocols = "file://"
//FIlE_DEFAULT 文件默认的写入方式
const FIlE_DEFAULT = os.O_TRUNC
//FILE_CREATE 写入文件不存在时自动创建
const FILE_CREATE = os.O_CREATE
//FILE_APEND 追加方式写入文件
const FILE_APEND = os.O_APPEND
//FileGetContents php file_get_contents 实现
func FileGetContents(path string) (string, error) {
for _, v := range UnSupportProtocols {
if strings.Index(path, v) == 0 {
return "", errors.New("暂时不支持对应协议")
}
}
if strings.Index(path, SupportProtocols) == 0 {
path = strings.TrimLeft(path, SupportProtocols)
}
fileInfo, serr := os.Stat(path)
if serr != nil {
return "", serr
}
if fileInfo.IsDir() {
return "", errors.New("不能读取文件夹数据")
}
if fileInfo.Size() > int64(1<<30) {
return "", errors.New("文件数据过大")
}
file, err := os.Open(path)
if err != nil {
return "", err
}
defer file.Close()
data := make([]byte, fileInfo.Size(), fileInfo.Size())
_, rerr := file.Read(data)
if rerr != nil {
return "", rerr
}
return string(data), nil
}
//FilePutContents php函数file_put_contents 实现
func FilePutContents(path string, content string, fType int) (int, error) {
mu.Lock()
defer mu.Unlock()
var file *os.File
var err error
_, err = os.Stat(path)
if err != nil {
if os.IsNotExist(err) {
dirPath := DirName(path)
_, derr := os.Stat(dirPath)
if os.IsNotExist(derr) {
cerr := os.MkdirAll(dirPath, os.ModePerm)
if cerr != nil {
return 0, cerr
}
}
} else {
return 0, err
}
}
file, err = os.OpenFile(path, os.O_RDWR|fType, os.FileMode(0666))
len, werr := file.WriteString(content)
if werr != nil {
return 0, werr
}
err = file.Close()
if err != nil {
return 0, werr
}
return len, nil
}
测试测试
php.FilePutContents("D:\\go\\ddd\\file_test.txt", "file_putcontents test", php.FILE_APEND|php.FILE_CREATE)