...

Source file src/os/dir_windows.go

     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 := newFileStatFromWin32finddata(d)
    50			f.name = name
    51			f.path = file.dirinfo.path
    52			f.appendNameToPath = true
    53			n--
    54			fi = append(fi, f)
    55		}
    56		if !wantAll && len(fi) == 0 {
    57			return fi, io.EOF
    58		}
    59		return fi, nil
    60	}
    61	
    62	func (file *File) readdirnames(n int) (names []string, err error) {
    63		fis, err := file.Readdir(n)
    64		names = make([]string, len(fis))
    65		for i, fi := range fis {
    66			names[i] = fi.Name()
    67		}
    68		return names, err
    69	}
    70	

View as plain text