Source file
src/os/dir_windows.go
1
2
3
4
5 package os
6
7 import (
8 "io"
9 "io/fs"
10 "runtime"
11 "syscall"
12 )
13
14 func (file *File) readdir(n int, mode readdirMode) (names []string, dirents []DirEntry, infos []FileInfo, err error) {
15
16 needdata := true
17 if file.dirinfo == nil {
18 needdata = false
19 file.dirinfo, err = openDir(file.name)
20 if err != nil {
21 err = &PathError{Op: "readdir", Path: file.name, Err: err}
22 return
23 }
24 }
25 wantAll := n <= 0
26 if wantAll {
27 n = -1
28 }
29 d := &file.dirinfo.data
30 for n != 0 && !file.dirinfo.isempty {
31 if needdata {
32 e := syscall.FindNextFile(file.dirinfo.h, d)
33 runtime.KeepAlive(file)
34 if e != nil {
35 if e == syscall.ERROR_NO_MORE_FILES {
36 break
37 } else {
38 err = &PathError{Op: "FindNextFile", Path: file.name, Err: e}
39 return
40 }
41 }
42 }
43 needdata = true
44 name := syscall.UTF16ToString(d.FileName[0:])
45 if name == "." || name == ".." {
46 continue
47 }
48 if mode == readdirName {
49 names = append(names, name)
50 } else {
51 f := newFileStatFromWin32finddata(d)
52 f.name = name
53 f.path = file.dirinfo.path
54 f.appendNameToPath = true
55 if mode == readdirDirEntry {
56 dirents = append(dirents, dirEntry{f})
57 } else {
58 infos = append(infos, f)
59 }
60 }
61 n--
62 }
63 if !wantAll && len(names)+len(dirents)+len(infos) == 0 {
64 return nil, nil, nil, io.EOF
65 }
66 return names, dirents, infos, nil
67 }
68
69 type dirEntry struct {
70 fs *fileStat
71 }
72
73 func (de dirEntry) Name() string { return de.fs.Name() }
74 func (de dirEntry) IsDir() bool { return de.fs.IsDir() }
75 func (de dirEntry) Type() FileMode { return de.fs.Mode().Type() }
76 func (de dirEntry) Info() (FileInfo, error) { return de.fs, nil }
77
78 func (de dirEntry) String() string {
79 return fs.FormatDirEntry(de)
80 }
81
View as plain text