Home | History | Annotate | Download | only in os
      1 // Copyright 2009 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package os
      6 
      7 import (
      8 	"io"
      9 	"runtime"
     10 	"syscall"
     11 )
     12 
     13 func (file *File) readdir(n int) (fi []FileInfo, err error) {
     14 	if file == nil {
     15 		return nil, syscall.EINVAL
     16 	}
     17 	if !file.isdir() {
     18 		return nil, &PathError{"Readdir", file.name, syscall.ENOTDIR}
     19 	}
     20 	wantAll := n <= 0
     21 	size := n
     22 	if wantAll {
     23 		n = -1
     24 		size = 100
     25 	}
     26 	fi = make([]FileInfo, 0, size) // Empty with room to grow.
     27 	d := &file.dirinfo.data
     28 	for n != 0 && !file.dirinfo.isempty {
     29 		if file.dirinfo.needdata {
     30 			e := file.pfd.FindNextFile(d)
     31 			runtime.KeepAlive(file)
     32 			if e != nil {
     33 				if e == syscall.ERROR_NO_MORE_FILES {
     34 					break
     35 				} else {
     36 					err = &PathError{"FindNextFile", file.name, e}
     37 					if !wantAll {
     38 						fi = nil
     39 					}
     40 					return
     41 				}
     42 			}
     43 		}
     44 		file.dirinfo.needdata = true
     45 		name := syscall.UTF16ToString(d.FileName[0:])
     46 		if name == "." || name == ".." { // Useless names
     47 			continue
     48 		}
     49 		f := &fileStat{
     50 			name: name,
     51 			sys: syscall.Win32FileAttributeData{
     52 				FileAttributes: d.FileAttributes,
     53 				CreationTime:   d.CreationTime,
     54 				LastAccessTime: d.LastAccessTime,
     55 				LastWriteTime:  d.LastWriteTime,
     56 				FileSizeHigh:   d.FileSizeHigh,
     57 				FileSizeLow:    d.FileSizeLow,
     58 			},
     59 			path:             file.dirinfo.path,
     60 			appendNameToPath: true,
     61 		}
     62 		n--
     63 		fi = append(fi, f)
     64 	}
     65 	if !wantAll && len(fi) == 0 {
     66 		return fi, io.EOF
     67 	}
     68 	return fi, nil
     69 }
     70 
     71 func (file *File) readdirnames(n int) (names []string, err error) {
     72 	fis, err := file.Readdir(n)
     73 	names = make([]string, len(fis))
     74 	for i, fi := range fis {
     75 		names[i] = fi.Name()
     76 	}
     77 	return names, err
     78 }
     79