}
func TestStatPagefile(t *testing.T) {
- _, err := os.Stat(`c:\pagefile.sys`)
+ fi, err := os.Stat(`c:\pagefile.sys`)
if err == nil {
+ if fi.Name() == "" {
+ t.Fatal(`FileInfo of c:\pagefile.sys has empty name`)
+ }
return
}
if os.IsNotExist(err) {
if err == nil && fa.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT == 0 {
// Not a symlink.
fs := &fileStat{
- path: name,
FileAttributes: fa.FileAttributes,
CreationTime: fa.CreationTime,
LastAccessTime: fa.LastAccessTime,
FileSizeHigh: fa.FileSizeHigh,
FileSizeLow: fa.FileSizeLow,
}
- // Gather full path to be used by os.SameFile later.
- if !isAbs(fs.path) {
- fs.path, err = syscall.FullPath(fs.path)
- if err != nil {
- return nil, &PathError{"FullPath", name, err}
- }
+ if err := fs.saveInfoFromPath(name); err != nil {
+ return nil, err
}
- fs.name = basename(name)
return fs, nil
}
// GetFileAttributesEx fails with ERROR_SHARING_VIOLATION error for
return nil, &PathError{"FindFirstFile", name, err}
}
syscall.FindClose(sh)
- return newFileStatFromWin32finddata(&fd), nil
+ fs := newFileStatFromWin32finddata(&fd)
+ if err := fs.saveInfoFromPath(name); err != nil {
+ return nil, err
+ }
+ return fs, nil
}
// Finally use CreateFile.
return nil
}
+// saveInfoFromPath saves full path of the file to be used by os.SameFile later,
+// and set name from path.
+func (fs *fileStat) saveInfoFromPath(path string) error {
+ fs.path = path
+ if !isAbs(fs.path) {
+ var err error
+ fs.path, err = syscall.FullPath(fs.path)
+ if err != nil {
+ return &PathError{"FullPath", path, err}
+ }
+ }
+ fs.name = basename(path)
+ return nil
+}
+
// devNullStat is fileStat structure describing DevNull file ("NUL").
var devNullStat = fileStat{
name: DevNull,