バッファbufioパッケージを使用して単一のファイルの読み取りと書き込みを行う
既存のファイルを開き、元のコンテンツを新しいコンテンツで上書きします。ここでファイルを作成する必要がないため、使用する必要はありません
os.O_CREATE。
os.O_TRUNC | os.O_WRONLY書き込み用に既存のファイルを開き、書き込み前にファイルの内容をクリアします。
fileSd,err := os.OpenFile("test.txt",os.O_TRUNC | os.O_WRONLY,os.ModePerm)
if err != nil{
fmt.Println("open file error:",err)
return
}
//及时关闭file文件句柄
defer fileSd.Close()
//写入的时候,使用带缓存的 *Writer
writer := bufio.NewWriter(fileSd)
for i := 0; i < 5; i++{
writer.WriteString("hh\r\n") //表示换行,为了在记事本和其他编辑器都可以看到换行效果
}
writer.Flush()
元のファイルの内容を追加する場合は、ログの書き込み時に追加するなど、元のファイルを上書きしないでください。
以下は追加の形式であり、上書きではありません。
fileSd,err := os.OpenFile("test.txt",os.O_APPEND | os.O_WRONLY,os.ModePerm)
次のステップは、ファイルを開き、元のコンテンツを読み取ってターミナルに表示し、追加することです。これには、ファイルを読み取りと書き込みのために開き、追加のために開く必要があります。
ここで重要なのは、読み取り/書き込みモードで開き、書き込み時に追加モードで書き込むように指示することです。
fileSd,err := os.OpenFile("test.txt",os.O_APPEND | os.O_RDWR,0666)
reader := bufio.NewReader(fileSd)
fmt.Println(reader)
for {
content,err := reader.ReadString('\n')
if err == io.EOF{ //如果读取到文件到末尾就不读了
break
}
fmt.Println(content,err)
}
バッファなし、1回限りの読み取りと書き込み
両方が存在する別のファイルに1つのファイルの内容を書き込むプログラムを作成します。
ioutil.ReadFile / ioutil.WriteFileを使用して、ファイルの書き込みタスクを完了します。
filePath := "test.txt"
//将文件的内容读取到内存,
content,err := ioutil.ReadFile(filePath)
if err != nil { //说明读取文件出错了,将错误信息输出,然后退出
fmt.Println("read fiile error:",err)
return //文件读取失败就结束了,不能往下走了
}
fmt.Println(string(content))
//将读取到到内容写入到文件里面
err = ioutil.WriteFile("test1.txt",content,os.ModePerm)
if err != nil{
fmt.Println("write file error:",err)
}
考え方は、実際には次の手順と同じです。ファイルを開いてからファイルを作成し、無限ループを使用して、開いたファイルからターゲットファイルにデータを継続的に書き込みます。
- srcf = open(src)
- dstf = create(dst)
- srcf=>ctxを読む
- ライターdstfctx=>
- srcf.close dstf.close()
ioパッケージにはコピー関数があります。このコピー関数は実際にsrcからコンテンツを読み取り、dstに書き込みます。以下は、ファイルからコンテンツを継続的に読み取り、標準出力に書き込むためのものです。
file,_ := os.Open("test.txt")
defer file.Close()
io.Copy(os.Stdout,file)
それがファイルかディレクトリかを判断します
ディレクトリを操作し、ディレクトリを読み取ります。
path := "test"
fileSd,err := os.Open(path)
fmt.Println(fileSd,err)
if err != nil{
return
}
defer fileSd.Close()
contents := make([]byte,10)
n,err := fileSd.Read(contents)
fmt.Println(n,err)
ディレクトリの場合、中身は読めません。したがって、ここでは、それがファイルかディレクトリかを判断する必要があります。
0 read test: is a directory
func(*ファイル) 統計
以下は、ファイルの名前を出力したり、それがディレクトリであるかどうかを判別したりするためのものです。
fileInfo,err := fileSd.Stat()
if err != nil{
fmt.Println(err)
}
fmt.Println(fileInfo.Name(),fileInfo.IsDir(),fileInfo.Mode(),fileInfo.ModTime().Format("2006-01-02 15:04:05"),fileInfo.Size())
test true drwxr-xr-x 2022-03-22 18:57:19 64
ディレクトリ内のすべてのファイルに関する情報を取得する
func(* File) Readdirnames
-1は、現在のフォルダの下にあるすべてのファイル名を読み取ることを意味し、再帰的に読み取ることはありません。
func(* File) Readdir
fileInfo,err := fileSd.Readdir(-1)
for _,v := range fileInfo{
fmt.Println(v.Name())
}
ファイルが存在するかどうかを確認します
ファイル操作を行う場合、プロジェクトでよく使われるファイルの有無を判断する機能がある場合があります。
ファイルが存在するかどうかを確認します
ファイルまたはフォルダーが存在するかどうかを判断するGolangの方法は、os.Stat()関数によって返されたエラー値を使用して判断することです。
- 返されたエラーがnilの場合、ファイルまたはフォルダーが存在します
- os.IsNotExist()を使用して、返されたエラータイプがtrueであると判断された場合、ファイルまたはフォルダーは存在しません。
- 返されたエラーが別のタイプの場合、それが存在するかどうかは不明です
func Stat
func Stat(name string)(FileInfo、error)
これにより、関数を単独で定義し、パスを入力してディレクトリまたはファイルが存在するかどうかを判断できます。(ファイルが存在するかどうかを判断するブール値に従って、ファイルパスを渡します。trueはファイル/フォルダーが存在することを意味します。そうでない場合)
func PathExits(path string) (bool,error) {
_,err := os.Stat(path)
if err == nil{ //文件或者目录存在
return true,nil
}
if os.IsNotExist(err) { //判断错误类型是不是不存在类型错误
return false,nil
}
return false,err //有错误,但是不是上面的错误类型,那么就将错误原封不动的返回
}
要約する
資料
- 作成:os.Create
- 読む:os.0pen
- プロパティを取得します:os.0pen()。Stat / os.Stat
- 属性の変更:権限、所有者
- 名前の変更:os.Rename( "test1.txt"、 "test2.txt")//名前を変更できるだけでなく、ファイルを特定のディレクトリに移動することもできますos.Rename( "test / file1"、 "a / b / c / file2 ")
- ファイルの削除:os.Remove( "test1.txt")
コピー機能はありません!
コンテンツ
- 创建:os.Mkdir( "a"、os.ModePerm)os.MkdirAll( "a / b / c"、os.ModePerm)
- 読む:os.0pen
- プロパティを取得します:os.0pen()。Stat / os.Stat
- 属性の変更:権限、所有者os.Chmod()os.Chown()
- 名前の変更:os.Rename
- フォルダを削除します:os.Remove os.RemoveAll