gopkg.in/essentialkaos/ek.v3@v3.5.1/fsutil/line_count.go (about)

     1  package fsutil
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                     Copyright (c) 2009-2016 Essential Kaos                         //
     6  //      Essential Kaos Open Source License <http://essentialkaos.com/ekol?en>         //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  import (
    11  	"bytes"
    12  	"io"
    13  	"os"
    14  )
    15  
    16  // ////////////////////////////////////////////////////////////////////////////////// //
    17  
    18  // LineCount return number of lines in file
    19  func LineCount(file string) int {
    20  	if !CheckPerms("FR", file) {
    21  		return -1
    22  	}
    23  
    24  	fd, err := os.OpenFile(file, os.O_RDONLY, 0644)
    25  
    26  	if err != nil {
    27  		return -1
    28  	}
    29  
    30  	defer fd.Close()
    31  
    32  	// Use 32k buffer
    33  	buf := make([]byte, 32*1024)
    34  	count := 0
    35  	sep := []byte{'\n'}
    36  
    37  	for {
    38  		c, err := fd.Read(buf)
    39  		if err != nil && err != io.EOF {
    40  			return count
    41  		}
    42  
    43  		count += bytes.Count(buf[:c], sep)
    44  
    45  		if err == io.EOF {
    46  			break
    47  		}
    48  	}
    49  
    50  	return count
    51  }