github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/os/dir_windows.go (about) 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 }