// Copyright 2009 The Go Authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style
|
// license that can be found in the LICENSE file.
|
|
package os
|
|
import (
|
"io"
|
"runtime"
|
"syscall"
|
)
|
|
func (file *File) readdir(n int) (fi []FileInfo, err error) {
|
if file == nil {
|
return nil, syscall.EINVAL
|
}
|
if !file.isdir() {
|
return nil, &PathError{"Readdir", file.name, syscall.ENOTDIR}
|
}
|
wantAll := n <= 0
|
size := n
|
if wantAll {
|
n = -1
|
size = 100
|
}
|
fi = make([]FileInfo, 0, size) // Empty with room to grow.
|
d := &file.dirinfo.data
|
for n != 0 && !file.dirinfo.isempty {
|
if file.dirinfo.needdata {
|
e := file.pfd.FindNextFile(d)
|
runtime.KeepAlive(file)
|
if e != nil {
|
if e == syscall.ERROR_NO_MORE_FILES {
|
break
|
} else {
|
err = &PathError{"FindNextFile", file.name, e}
|
if !wantAll {
|
fi = nil
|
}
|
return
|
}
|
}
|
}
|
file.dirinfo.needdata = true
|
name := syscall.UTF16ToString(d.FileName[0:])
|
if name == "." || name == ".." { // Useless names
|
continue
|
}
|
f := newFileStatFromWin32finddata(d)
|
f.name = name
|
f.path = file.dirinfo.path
|
f.appendNameToPath = true
|
n--
|
fi = append(fi, f)
|
}
|
if !wantAll && len(fi) == 0 {
|
return fi, io.EOF
|
}
|
return fi, nil
|
}
|
|
func (file *File) readdirnames(n int) (names []string, err error) {
|
fis, err := file.Readdir(n)
|
names = make([]string, len(fis))
|
for i, fi := range fis {
|
names[i] = fi.Name()
|
}
|
return names, err
|
}
|