文件 io

文件操作

package main

import (
    "fmt"
    "os"
)

func main() {
    /*
    FileInfo:文件信息
        interface
            Name():文件名
            Size():文件大小,單位字節(jié)
            IsDir():是否為目錄
            ModTime():修改時間
            Mode():權(quán)限
    */
    fileinfo,err := os.Stat("/Users/isuntong/Documents/test/a/abc.txt")
    if err != nil {
        fmt.Println("err:",err)
        return
    }
    fmt.Printf("%T\n",fileinfo) // *os.fileStat

    //文件名
    fmt.Println(fileinfo.Name()) //abc.txt

    //大小
    fmt.Println(fileinfo.Size()) //12

    //是不是目錄
    fmt.Println(fileinfo.IsDir()) //false

    //修改時間
    fmt.Println(fileinfo.ModTime()) //2020-03-17 11:55:30.703993888 +0800 CST

    //權(quán)限
    fmt.Println(fileinfo.Mode()) //-rw-r--r--


}
package main

import (
    "fmt"
    "os"
    "path"
    "path/filepath"
)

//4
func main() {
    /*
    文件操作:
    1.路徑:
        相對路徑:relative
            相對于當(dāng)前工程:abc.txt
        絕對路徑:absolute
            /Users/isuntong/Documents/test/a/abc.txt

        .當(dāng)前目錄
        ..上一層
    */
    //1。路徑
    fileName1 := "/Users/isuntong/Documents/test/a/abc.txt"
    fileName2 := "ab.txt"
    //是否是絕對路徑
    fmt.Println(filepath.IsAbs(fileName1)) //true
    fmt.Println(filepath.IsAbs(fileName2)) //false
    fmt.Println(filepath.Abs(fileName1)) ///Users/isuntong/Documents/test/a/abc.txt <nil>
    fmt.Println(filepath.Abs(fileName2)) ///Users/isuntong/go/src/demo/ab.txt <nil>

    fmt.Println("獲取父目錄:",path.Join(fileName1,"..")) //獲取父目錄: /Users/isuntong/Documents/test/a

    //2. 創(chuàng)建目錄 os.ModePerm權(quán)限
    err := os.Mkdir("/Users/isuntong/Documents/test/a/bb",os.ModePerm)
    if err != nil {
        fmt.Println("err:",err)
        // return
    }
    fmt.Println("文件夾創(chuàng)建成功")

    err2 := os.MkdirAll("/Users/isuntong/Documents/test/a/cc/dd/ee",os.ModePerm)
    if err2 != nil {
        fmt.Println("err:",err2)
        // return
    }
    fmt.Println("多層文件夾創(chuàng)建成功")

    //3。 創(chuàng)建文件 不存在創(chuàng)建,存在使其變?yōu)榭?    file1,err3 := os.Create("/Users/isuntong/Documents/test/a/ab.txt")
    if err3 != nil {
        fmt.Println("err:",err3)
        // return
    }
    fmt.Println(file1) //&{0xc0000b2120}

    //4。 打開文件 讓當(dāng)前程序和指定文件之間簡歷連接
    //os.open(filename)
    //os.openFile(filename,mode,perm)
    file3,err := os.Open(fileName1)
    fmt.Println(file3) //&{0xc000132180}

    file4,err := os.OpenFile(fileName1,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
    fmt.Println(file4)

    //5. 關(guān)閉文件
    file4.Close()
    
    //6. 刪除文件或者文件夾
    // err := os.Remove("/Users/isuntong/Documents/test/a/ab.txt")
    // err := os.Remove("/Users/isuntong/Documents/test/a/") //刪除目錄,如果不為空不能刪除
    // err := os.RemoveAll("/Users/isuntong/Documents/test/a/") //刪除目錄,謹(jǐn)慎使用
    
}

io讀操作

package main

import (
    "fmt"
    "io"
    "os"
)

//5
func main() {
    /*
    讀取數(shù)據(jù):
        Reader借口:
            Read(p [[byte)(n int,error)


    讀取本地abc.txt文件中的數(shù)據(jù)、

    */
    //1。 打開文件
    fileName := "/Users/isuntong/Documents/test/a/abc.txt"
    file,err := os.Open(fileName)
    if err != nil {
        fmt.Println("err:",err)
        return
    }

    //3。 關(guān)閉文件
    defer file.Close()

    //2。 讀取數(shù)據(jù) abcdefghij
    bs := make([]byte,4,4)

/*
    //第一次讀取
    n,err := file.Read(bs)
    fmt.Println(err) //<nil>
    fmt.Println(n) //4
    fmt.Println(bs) //[97 98 99 100]
    fmt.Println(string(bs)) //abcd

    //第二次讀取
    n,err = file.Read(bs)
    fmt.Println(err) //<nil>
    fmt.Println(n) //4
    fmt.Println(bs) //[101 102 103 104]
    fmt.Println(string(bs)) //efgh

    //第三次讀取
    n,err = file.Read(bs)
    fmt.Println(err) //<nil>
    fmt.Println(n) //2
    fmt.Println(bs) //[105 106 103 104]
    fmt.Println(string(bs)) //ijgh

    //第四次讀取
    n,err = file.Read(bs)
    fmt.Println(err) //EOF
    fmt.Println(n) //0
    fmt.Println(bs) //[105 106 103 104]
    fmt.Println(string(bs)) //ijgh
*/

/*
   abcd
   efgh
   ij
   讀取到文件末尾,結(jié)束讀取操作
*/
    n := -1
    for {
        n,err = file.Read(bs)
        if n==0 || err == io.EOF{
            fmt.Println("讀取到文件末尾,結(jié)束讀取操作")
            break
        }
        fmt.Println(string(bs[:n]))
    }


}

io寫操作

package main

import (
    "fmt"
    "log"
    "os"
)

//6
func main() {
    /*
    寫出數(shù)據(jù):

    讀取本地abc.txt文件中的數(shù)據(jù)、

    */
    fileName := "/Users/isuntong/Documents/test/a/ab.txt"

    //1. 打開文件
    //file,err := os.Open(fileName) 沒有權(quán)限,只有只讀,寫的時候報錯  bad file descriptor
    //O_APPEND 這樣就是追加,不是覆蓋
    file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,os.ModePerm)
    if err != nil {
        fmt.Println("err",err)
        return
    }

    //3. 關(guān)閉文件
    defer file.Close()

    //2. 寫出數(shù)據(jù) 每次從頭開始寫,即覆蓋之前的n個
    bs := []byte{65,66,67,68,69,70} //ABCDEF
    //n,err := file.Write(bs)
    n,err := file.Write(bs[:2])
    fmt.Println(n) //2
    HandleErr(err)

    //直接寫出字符串
    n,err = file.WriteString("helloworld")
    fmt.Println(n) //10
    HandleErr(err)

    //換行
    file.WriteString("\n")
    n,err = file.Write([]byte("today"))


}

func HandleErr(err error) {
    if err != nil {
        log.Fatal(err)
    }
}

復(fù)制文件

package main

import (
   "fmt"
   "io"
   "io/ioutil"
   "os"
)

//7
func main() {
   /*
   拷貝文件:

   讀取本地abc.txt文件中的數(shù)據(jù)、拷貝圖片什么的也可以

   */
   srcFile := "/Users/isuntong/Documents/test/a/ab.txt"
   destFile := "ab.txt"

   total,err := CopyFile1(srcFile,destFile) //拷貝完畢
   fmt.Println(total,err) //38 <nil>


}

//利用ioutil
func CopyFile3(srcFile,destFile string) (int,error) {
   bs,err := ioutil.ReadFile(srcFile)
   if err != nil {
       return 0,err
   }

   err = ioutil.WriteFile(destFile,bs,0777)
   if err != nil {
       return 0,err
   }
   return len(bs),nil

}

//使用io.Copy()方法 這種方法比較好
func CopyFile2(srcFile,destFile string) (int64,error) {
   file1,err := os.Open(srcFile)
   if err != nil {
       return 0,err
   }

   file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
   if err != nil {
       return 0,err
   }

   defer file1.Close()
   defer file2.Close()

   return io.Copy(file2,file1)

}


//用于通過io操作實現(xiàn)文件的拷貝,返回值是拷貝的總數(shù)量(字節(jié)),錯誤
func CopyFile1(srcFile,destFile string) (int,error) {
   file1,err := os.Open(srcFile)
   if err != nil {
       return 0,err
   }

   file2,err := os.OpenFile(destFile,os.O_WRONLY|os.O_CREATE,os.ModePerm)
   if err != nil {
       return 0,err
   }


   defer file1.Close()
   defer file2.Close()
   //讀寫
   bs := make([]byte,1024,1024)
   n := -1
   total := 0
   for {
       n,err = file1.Read(bs)
       if err == io.EOF || n == 0 {
           fmt.Println("拷貝完畢")
           break
       } else if err != nil {
           fmt.Println("出錯了。。。")
           return total,err
       }
       total += n
       file2.Write(bs[:n])
   }
   return total,nil
}

斷點續(xù)傳

bufio包

func NewReader(rd io.Reader) *Reader

func NewReaderSize(rd io.Reader,size int) *Reader

ioutil包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容