...
Source file src/os/dir_windows.go
1
2
3
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)
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 == ".." {
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