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  	"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  	// If this file has no dirinfo, create one.
    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 == ".." { // Useless names
    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