Last active
January 16, 2016 04:33
-
-
Save tma15/78146f0762e8c12571e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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