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} } if !file.dirinfo.isempty && file.fd == syscall.InvalidHandle { return nil, syscall.EINVAL } 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 := syscall.FindNextFile(syscall.Handle(file.fd), d) 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 := string(syscall.UTF16ToString(d.FileName[0:])) if name == "." || name == ".." { // Useless names continue } f := &fileStat{ name: name, sys: syscall.Win32FileAttributeData{ FileAttributes: d.FileAttributes, CreationTime: d.CreationTime, LastAccessTime: d.LastAccessTime, LastWriteTime: d.LastWriteTime, FileSizeHigh: d.FileSizeHigh, FileSizeLow: d.FileSizeLow, }, path: file.dirinfo.path + `\` + name, } n-- fi = append(fi, f) } if !wantAll && len(fi) == 0 { return fi, io.EOF } return fi, nil }
// Readdir reads the contents of the directory associated with file and // returns an array of up to n FileInfo structures, as would be returned // by Lstat, in directory order. Subsequent calls on the same file will yield // further FileInfos. // // If n > 0, Readdir returns at most n FileInfo structures. In this case, if // Readdir returns an empty slice, it will return a non-nil error // explaining why. At the end of a directory, the error is os.EOF. // // If n <= 0, Readdir returns all the FileInfo from the directory in // a single slice. In this case, if Readdir succeeds (reads all // the way to the end of the directory), it returns the slice and a // nil os.Error. If it encounters an error before the end of the // directory, Readdir returns the FileInfo read until that point // and a non-nil error. func (file *File) Readdir(n int) (fi []FileInfo, err Error) { if file == nil || file.fd < 0 { return nil, EINVAL } if !file.isdir() { return nil, &PathError{"Readdir", file.name, ENOTDIR} } di := file.dirinfo wantAll := n <= 0 size := n if wantAll { n = -1 size = 100 } fi = make([]FileInfo, 0, size) // Empty with room to grow. for n != 0 { if di.usefirststat { di.usefirststat = false } else { e := syscall.FindNextFile(syscall.Handle(file.fd), &di.stat.Windata) if e != 0 { if e == syscall.ERROR_NO_MORE_FILES { break } else { err = &PathError{"FindNextFile", file.name, Errno(e)} if !wantAll { fi = nil } return } } } var f FileInfo fileInfoFromWin32finddata(&f, &di.stat.Windata) if f.Name == "." || f.Name == ".." { // Useless names continue } n-- fi = append(fi, f) } if !wantAll && len(fi) == 0 { return fi, EOF } return fi, nil }
func (file *File) readdir(n int) (fi []FileInfo, err error) { if file == nil || file.fd < 0 { return nil, EINVAL } if !file.isdir() { return nil, &PathError{"Readdir", file.name, 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 { if file.dirinfo.needdata { e := syscall.FindNextFile(syscall.Handle(file.fd), d) 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 := string(syscall.UTF16ToString(d.FileName[0:])) if name == "." || name == ".." { // Useless names continue } f := toFileInfo(name, d.FileAttributes, d.FileSizeHigh, d.FileSizeLow, d.CreationTime, d.LastAccessTime, d.LastWriteTime) n-- fi = append(fi, f) } if !wantAll && len(fi) == 0 { return fi, io.EOF } return fi, nil }
// Readdir reads the contents of the directory associated with file and // returns an array of up to count FileInfo structures, as would be returned // by Stat, in directory order. Subsequent calls on the same file will yield // further FileInfos. // A negative count means to read until EOF. // Readdir returns the array and an Error, if any. func (file *File) Readdir(count int) (fi []FileInfo, err Error) { di := file.dirinfo size := count if size < 0 { size = 100 } fi = make([]FileInfo, 0, size) // Empty with room to grow. for count != 0 { if di.usefirststat { di.usefirststat = false } else { _, e := syscall.FindNextFile(int32(file.fd), &di.stat.Windata) if e != 0 { if e == syscall.ERROR_NO_MORE_FILES { break } else { return nil, &PathError{"FindNextFile", file.name, Errno(e)} } } } var f FileInfo fileInfoFromWin32finddata(&f, &di.stat.Windata) if f.Name == "." || f.Name == ".." { // Useless names continue } count-- if len(fi) == cap(fi) { nfi := make([]FileInfo, len(fi), 2*len(fi)) for i := 0; i < len(fi); i++ { nfi[i] = fi[i] } fi = nfi } fi = fi[0 : len(fi)+1] fi[len(fi)-1] = f } return fi, nil }
func (this *FileInfo) findNext() error { return syscall.FindNextFile(this.handle, &this.data1) }