# Fileutil Package fileutil implements some basic functions for file operations.
## Source: - [https://github.com/duke-git/lancet/blob/main/fileutil/file.go](https://github.com/duke-git/lancet/blob/main/fileutil/file.go) ## Usage: ```go import ( "github.com/duke-git/lancet/v2/fileutil" ) ``` ## Index - [ClearFile](#ClearFile) - [CreateFile](#CreateFile) - [CreateDir](#CreateDir) - [CopyFile](#CopyFile) - [CopyDir](#CopyDir) - [CurrentPath](#CurrentPath) - [FileMode](#FileMode) - [MiMeType](#MiMeType) - [IsExist](#IsExist) - [IsLink](#IsLink) - [IsDir](#IsDir) - [ListFileNames](#ListFileNames) - [RemoveFile](#RemoveFile) - [ReadFileToString](#ReadFileToString) - [ReadFileByLine](#ReadFileByLine) - [Zip](#Zip) - [ZipAppendEntry](#ZipAppendEntry) - [UnZip](#UnZip) - [IsZipFile](#IsZipFile) - [FileSize](#FileSize) - [MTime](#MTime) - [Sha](#Sha) - [ReadCsvFile](#ReadCsvFile) - [WriteCsvFile](#WriteCsvFile) - [WriteMapsToCsv](#WriteMapsToCsv) - [WriteStringToFile](#WriteStringToFile) - [WriteBytesToFile](#WriteBytesToFile) - [ReadFile](#ReadFile) - [ChunkRead](#ChunkRead) - [ParallelChunkRead](#ParallelChunkRead) - [GetExeOrDllVersion](#GetExeOrDllVersion) ## Documentation ### ClearFileClear the file content, write empty string to the file.
Signature: ```go func ClearFile(path string) error ``` Example:[Run](https://go.dev/play/p/NRZ0ZT-G94H) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.ClearFile("./test.txt") if err != nil { fmt.Println(err) } } ``` ### CreateFileCreate file in path. return true if create succeed.
Signature: ```go func CreateFile(path string) bool ``` Example:[Run](https://go.dev/play/p/lDt8PEsTNKI) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { isCreatedSucceed := fileutil.CreateFile("./test.txt") fmt.Println(isCreatedSucceed) } ``` ### CreateDirCreate directory in absolute path. param `absPath` like /a, /a/b.
Signature: ```go func CreateDir(absPath string) error ``` Example:[Run](https://go.dev/play/p/qUuCe1OGQnM) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.CreateDir("/a/b") // will create folder /a/b fmt.Println(err) } ``` ### CopyFileCopy src file to dest file. If dest file exist will overwrite it.
Signature: ```go func CopyFile(srcPath string, dstPath string) error ``` Example:[Run](https://go.dev/play/p/Jg9AMJMLrJi) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.CopyFile("./test.txt", "./test_copy.txt") if err != nil { fmt.Println(err) } } ``` ### CopyDirCopy src directory to dst directory, it will copy all files and directories recursively. the access permission will be the same as the source directory. if dstPath exists, it will return an error.
Signature: ```go func CopyDir(srcPath string, dstPath string) error ``` Example:[Run](https://go.dev/play/p/YAyFTA_UuPb) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.CopyFile("./test_src", "./test_dest") if err != nil { fmt.Println(err) } } ``` ### CurrentPathreturn current absolute path.
Signature: ```go func CurrentPath() string ``` Example:[Run](https://go.dev/play/p/s74a9iBGcSw) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { absPath := CurrentPath() fmt.Println(absPath) } ``` ### FileModeReturn file mode infomation.
Signature: ```go func FileMode(path string) (fs.FileMode, error) ``` Example:[Run](https://go.dev/play/p/2l2hI42fA3p) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { mode, err := fileutil.FileMode("./test.txt") if err != nil { fmt.Println(err) } fmt.Println(mode) } ``` ### MiMeTypeGet file mime type, 'file' param's type should be string or *os.File.
Signature: ```go func MiMeType(file any) string ``` Example:[Run](https://go.dev/play/p/bd5sevSUZNu) ```go package main import ( "fmt" "os" "github.com/duke-git/lancet/v2/fileutil" ) func main() { type1 := fileutil.MiMeType("./test.txt") fmt.Println(type1) //text/plain; charset=utf-8 f, _ := os.Open("./file.go") type2 := fileutil.MiMeType(f) fmt.Println(type2) //text/plain; charset=utf-8 } ``` ### IsExistChecks if a file or directory exists.
Signature: ```go func IsExist(path string) bool ``` Example:[Run](https://go.dev/play/p/nKKXt8ZQbmh) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { fileutil.CreateFile("./test.txt") isFileExist := fileutil.IsExist("./test.txt") fmt.Println(isFileExist) //true } ``` ### IsLinkChecks if a file is symbol link or not.
Signature: ```go func IsLink(path string) bool ``` Example:[Run](https://go.dev/play/p/TL-b-Kzvf44) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { isLinkFile := fileutil.IsLink("./test.txt") fmt.Println(isLinkFile) //false } ``` ### IsDirChecks if the path is directy or not.
Signature: ```go func IsDir(path string) bool ``` Example:[Run](https://go.dev/play/p/WkVwEKqtOWk) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { isDir := fileutil.IsDir("./") fmt.Println(isDir) //true isDir = fileutil.IsDir("./test.txt") fmt.Println(isDir) //false } ``` ### ListFileNamesList all file names in given path.
Signature: ```go func ListFileNames(path string) ([]string, error) ``` Example:[Run](https://go.dev/play/p/Tjd7Y07rejl) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { fileNames, _ := fileutil.ListFileNames("./") fmt.Println(fileNames) } ``` ### RemoveFileRemove the file of path.
Signature: ```go func RemoveFile(path string) error ``` Example:[Run](https://go.dev/play/p/P2y0XW8a1SH) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.RemoveFile("./test.txt") if err != nil { fmt.Println(err) } } ``` ### ReadFileToStringReturn string of file content.
Signature: ```go func ReadFileToString(path string) (string, error) ``` Example:[Run](https://go.dev/play/p/cmfwp_5SQTp) ```go package main import ( "fmt" "os" "github.com/duke-git/lancet/v2/fileutil" ) func main() { path := "./test.txt" fileutil.CreateFile(path) f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777) f.WriteString("hello world") content, _ := fileutil.ReadFileToString(path) fmt.Println(content) //hello world } ``` ### ReadFileByLineRead file line by line, and return slice of lines
Signature: ```go func ReadFileByLine(path string)([]string, error) ``` Example:[Run](https://go.dev/play/p/svJP_7ZrBrD) ```go package main import ( "fmt" "os" "github.com/duke-git/lancet/v2/fileutil" ) func main() { path := "./text.txt" fileutil.CreateFile(path) f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777) defer f.Close() f.WriteString("hello\nworld") contents, _ := fileutil.ReadFileByLine(path) fmt.Println(contents) //[]string{"hello", "world"} } ``` ### ZipCreate a zip file of fpath, fpath could be a file or a directory.
Signature: ```go func Zip(fpath string, destPath string) error ``` Example:[Run](https://go.dev/play/p/j-3sWBp8ik_P) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.Zip("./test.txt", "./test.zip") if err != nil { fmt.Println(err) } } ``` ### ZipAppendEntryAppend a single file or directory by fpath to an existing zip file.
Signature: ```go func ZipAppendEntry(fpath string, destPath string) error ``` Example:[Run](https://go.dev/play/p/cxvaT8TRNQp) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.ZipAppendEntry("./test.txt", "./test.zip") if err != nil { fmt.Println(err) } } ``` ### UnZipUnzip the file and save it to dest path.
Signature: ```go func UnZip(zipFile string, destPath string) error ``` Example:[Run](https://go.dev/play/p/g0w34kS7B8m) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { err := fileutil.UnZip("./test.zip", "./test.txt") if err != nil { fmt.Println(err) } } ``` ### IsZipFileChecks if file is zip file or not.
Signature: ```go func IsZipFile(filepath string) bool ``` Example:[Run](https://go.dev/play/p/9M0g2j_uF_e) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { isZip := fileutil.IsZipFile("./zipfile.zip") fmt.Println(isZip) } ``` ### FileSizeReturns file size in bytes.
Signature: ```go func FileSize(path string) (int64, error) ``` Example:[Run](https://go.dev/play/p/H9Z05uD-Jjc) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { size, err := fileutil.FileSize("./testdata/test.txt") fmt.Println(size) fmt.Println(err) // Output: // 20 //Returns file modified time(unix timestamp).
Signature: ```go func MTime(filepath string) (int64, error) ``` Example:[Run](https://go.dev/play/p/s_Tl7lZoAaY) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { mtime, err := fileutil.MTime("./testdata/test.txt") fmt.Println(mtime) fmt.Println(err) // Output: // 1682391110 //returns file sha value, param `shaType` should be 1, 256 or 512.
Signature: ```go func Sha(filepath string, shaType ...int) (string, error) ``` Example:[Run](https://go.dev/play/p/VfEEcO2MJYf) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { sha1, err := fileutil.Sha("./testdata/test.txt", 1) sha256, _ := fileutil.Sha("./testdata/test.txt", 256) sha512, _ := fileutil.Sha("./testdata/test.txt", 512) fmt.Println(sha1) fmt.Println(sha256) fmt.Println(sha512) fmt.Println(err) // Output: // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7 // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35 // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870 //Reads file content into slice.
Signature: ```go func ReadCsvFile(filepath string, delimiter ...rune) ([][]string, error) ``` Example:[Run](https://go.dev/play/p/OExTkhGEd3_u) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { content, err := fileutil.ReadCsvFile("./testdata/test.csv") fmt.Println(content) fmt.Println(err) // Output: // [[Bob 12 male] [Duke 14 male] [Lucy 16 female]] //Write content to target csv file.
Signature: ```go func WriteCsvFile(filepath string, records [][]string, append bool, delimiter ...rune) error ``` Example:[Run](https://go.dev/play/p/dAXm58Q5U1o) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { fpath := "./test.csv" fileutil.CreateFile(fpath) f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777) defer f.Close() data := [][]string{ {"Lili", "22", "female"}, {"Jim", "21", "male"}, } err := fileutil.WriteCsvFile(fpath, data, false) if err != nil { return } content, err := fileutil.ReadCsvFile(fpath) if err != nil { return } fmt.Println(content) // Output: // [[Lili 22 female] [Jim 21 male]] } ``` ### WriteMapsToCsvWrite slice of map to csv file.
Signature: ```go // filepath: path of the CSV file. // records: slice of maps to be written. the value of map should be basic type. The maps will be sorted by key in alphabeta order, then be written into csv file. // appendToExistingFile: If true, data will be appended to the file if it exists. // delimiter: Delimiter to use in the CSV file. // headers: order of the csv column headers, needs to be consistent with the key of the map. func WriteMapsToCsv(filepath string, records []map[string]any, appendToExistingFile bool, delimiter rune, headers ...[]string) error ``` Example:[运行](https://go.dev/play/p/umAIomZFV1c) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { fpath := "./test.csv" fileutil.CreateFile(fpath) f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777) defer f.Close() records := []map[string]any{ {"Name": "Lili", "Age": "22", "Gender": "female"}, {"Name": "Jim", "Age": "21", "Gender": "male"}, } headers := []string{"Name", "Age", "Gender"} err := fileutil.WriteMapsToCsv(csvFilePath, records, false, ';', headers) if err != nil { log.Fatal(err) } content, err := fileutil.ReadCsvFile(csvFilePath, ';') fmt.Println(content) // Output: // [[Name Age Gender] [Lili 22 female] [Jim 21 male]] } ``` ### WriteBytesToFileWrites bytes to target file.
Signature: ```go func WriteBytesToFile(filepath string, content []byte) error ``` Example:[Run](https://go.dev/play/p/s7QlDxMj3P8) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { filepath := "./bytes.txt" file, err := os.Create(filepath) if err != nil { return } defer file.Close() err = fileutil.WriteBytesToFile(filepath, []byte("hello")) if err != nil { return } content, err := fileutil.ReadFileToString(filepath) if err != nil { return } os.Remove(filepath) fmt.Println(content) // Output: // hello } ``` ### WriteStringToFileWrites string to target file.
Signature: ```go func WriteStringToFile(filepath string, content string, append bool) error ``` Example:[Run](https://go.dev/play/p/GhLS6d8lH_g) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { filepath := "./test.txt" file, err := os.Create(filepath) if err != nil { return } defer file.Close() err = fileutil.WriteStringToFile(filepath, "hello", true) if err != nil { return } content, err := fileutil.ReadFileToString(filepath) if err != nil { return } os.Remove(filepath) fmt.Println(content) // Output: // hello } ``` ### ReadFileRead File or URL.
Signature: ```go func ReadFile(path string) (reader io.ReadCloser, closeFn func(), err error) ``` Example:[Run](https://go.dev/play/p/uNep3Tr8fqF) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { reader, fn, err := fileutil.ReadFile("https://httpbin.org/robots.txt") if err != nil { return } defer fn() dat, err := io.ReadAll(reader) if err != nil { return } fmt.Println(string(dat)) // Output: // User-agent: * // Disallow: /deny } ``` ### ChunkReadreads a block from the file at the specified offset and returns all lines within the block.
Signature : ```go func ChunkRead(file *os.File, offset int64, size int, bufPool *sync.Pool) ([]string, error) ``` Example:[Run](https://go.dev/play/p/r0hPmKWhsgf) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { const mb = 1024 * 1024 const defaultChunkSizeMB = 100 // test1.csv file content: // Lili,22,female // Jim,21,male filePath := "./testdata/test1.csv" f, err := os.Open(filePath) if err != nil { return } defer f.Close() var bufPool = sync.Pool{ New: func() interface{} { return make([]byte, 0, defaultChunkSizeMB*mb) }, } lines, err := fileutil.ChunkRead(f, 0, 100, &bufPool) if err != nil { return } fmt.Println(lines[0]) fmt.Println(lines[1]) // Output: // Lili,22,female // Jim,21,male } ``` ### ParallelChunkReadReads the file in parallel and send each chunk of lines to the specified channel.
Signature : ```go // filePath: file path. // chunkSizeMB: The size of the block (in MB, the default is 100MB when set to 0). Setting it too large will be detrimental. Adjust it as appropriate. // maxGoroutine: The number of concurrent read chunks, the number of CPU cores used when set to 0. // linesCh: The channel used to receive the returned results. func ParallelChunkRead(filePath string, linesCh chan<- []string, chunkSizeMB, maxGoroutine int) error ``` Example:[Run](https://go.dev/play/p/teMXnCsdSEw) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { const mb = 1024 * 1024 const defaultChunkSizeMB = 100 // 默认值 numParsers := runtime.NumCPU() linesCh := make(chan []string, numParsers) // test1.csv file content: // Lili,22,female // Jim,21,male filePath := "./testdata/test1.csv" go fileutil.ParallelChunkRead(filePath, linesCh, defaultChunkSizeMB, numParsers) var totalLines int for lines := range linesCh { totalLines += len(lines) for _, line := range lines { fmt.Println(line) } } fmt.Println(totalLines) // Output: // Lili,22,female // Jim,21,male // 2 } ``` ### GetExeOrDllVersionGet the version of exe or dll file on windows.
Signature: ```go func GetExeOrDllVersion(filePath string) (string, error) ``` Example:[Run](todo) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/fileutil" ) func main() { v, err := fileutil.GetExeOrDllVersion(`C:\Program Files\Tencent\WeChat\WeChat.exe`) if err != nil { panic(err) } fmt.Println(v) // Output: // 3.9.10.19 } ```