Skip to content

Instantly share code, notes, and snippets.

@tma15
Last active January 16, 2016 04:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tma15/78146f0762e8c12571e0 to your computer and use it in GitHub Desktop.
Save tma15/78146f0762e8c12571e0 to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"fmt"
"io/ioutil"
"os"
"sort"
"syscall"
)
type byInode []os.FileInfo
func (this byInode) Len() int { return len(this) }
func (this byInode) Less(i, j int) bool {
fstat_i := this[i].Sys().(*syscall.Stat_t)
fstat_j := this[j].Sys().(*syscall.Stat_t)
return fstat_i.Ino < fstat_j.Ino
}
func (this byInode) Swap(i, j int) { this[i], this[j] = this[j], this[i] }
func MyReadDir(dirname string) ([]os.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1)
f.Close()
if err != nil {
return nil, err
}
return list, nil
}
func MyReadDirSortByInode(dirname string) ([]os.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1)
f.Close()
if err != nil {
return nil, err
}
sort.Sort(byInode(list))
return list, nil
}
func countLines(file string) (int, error) {
var err error
fp, err := os.Open(file)
if err != nil {
return -1, err
}
defer fp.Close()
scanner := bufio.NewScanner(fp)
cnt := 0
for scanner.Scan() {
cnt += 1
}
if err = scanner.Err(); err != nil {
return -1, err
}
return cnt, err
}
func main() {
var cnt int = 0
var numFiles int = 0
par := os.Args[1]
switch os.Args[2] {
case "1":
fileinfos, _ := MyReadDirSortByInode(par)
for _, fi := range fileinfos {
name := fmt.Sprintf("%s/%s", par, fi.Name())
c, err := countLines(name)
if err != nil {
panic(err)
}
cnt += c
numFiles += 1
}
case "2":
fileinfos, _ := MyReadDir(par)
for _, fi := range fileinfos {
name := fmt.Sprintf("%s/%s", par, fi.Name())
c, err := countLines(name)
if err != nil {
panic(err)
}
cnt += c
numFiles += 1
}
case "3":
fileinfos, _ := ioutil.ReadDir(par)
for _, fi := range fileinfos {
name := fmt.Sprintf("%s/%s", par, fi.Name())
c, err := countLines(name)
if err != nil {
panic(err)
}
cnt += c
numFiles += 1
}
}
fmt.Println(os.Args[1], "num files", numFiles, "num lines", cnt)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment