func (BasicFilesystem) ReadSymlink(path string) (string, LinkTargetType, error) { ptr, err := syscall.UTF16PtrFromString(path) if err != nil { return "", LinkTargetUnknown, err } handle, err := syscall.CreateFile(ptr, 0, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS|win32FileFlagOpenReparsePoint, 0) if err != nil || handle == syscall.InvalidHandle { return "", LinkTargetUnknown, err } defer syscall.Close(handle) var ret uint16 var data reparseData r1, _, err := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), win32FsctlGetReparsePoint, 0, 0, uintptr(unsafe.Pointer(&data)), unsafe.Sizeof(data), uintptr(unsafe.Pointer(&ret)), 0, 0) if r1 == 0 { return "", LinkTargetUnknown, err } tt := LinkTargetUnknown if attr, err := syscall.GetFileAttributes(ptr); err == nil { if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { tt = LinkTargetDirectory } else { tt = LinkTargetFile } } return osutil.NormalizedFilename(data.printName()), tt, nil }
// Remove removes the named file or directory. // If there is an error, it will be of type *PathError. func Remove(name string) error { p, e := syscall.UTF16PtrFromString(name) if e != nil { return &PathError{"remove", name, e} } // Go file interface forces us to know whether // name is a file or directory. Try both. e = syscall.DeleteFile(p) if e == nil { return nil } e1 := syscall.RemoveDirectory(p) if e1 == nil { return nil } // Both failed: figure out which error to return. if e1 != e { a, e2 := syscall.GetFileAttributes(p) if e2 != nil { e = e2 } else { if a&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { e = e1 } } } return &PathError{"remove", name, e} }
func Read(path string) (string, uint32, error) { ptr, err := syscall.UTF16PtrFromString(path) if err != nil { return "", protocol.FlagSymlinkMissingTarget, err } handle, err := syscall.CreateFile(ptr, 0, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS|Win32FileFlagOpenReparsePoint, 0) if err != nil || handle == syscall.InvalidHandle { return "", protocol.FlagSymlinkMissingTarget, err } defer syscall.Close(handle) var ret uint16 var data reparseData r1, _, err := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), Win32FsctlGetReparsePoint, 0, 0, uintptr(unsafe.Pointer(&data)), unsafe.Sizeof(data), uintptr(unsafe.Pointer(&ret)), 0, 0) if r1 == 0 { return "", protocol.FlagSymlinkMissingTarget, err } var flags uint32 attr, err := syscall.GetFileAttributes(ptr) if err != nil { flags = protocol.FlagSymlinkMissingTarget } else if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { flags = protocol.FlagDirectory } return osutil.NormalizedFilename(data.PrintName()), flags, nil }
func GetFileAttributes(path string) (uint32, error) { cpath, cpathErr := syscall.UTF16PtrFromString(path) if cpathErr != nil { return 0, cpathErr } return syscall.GetFileAttributes(cpath) }
func IsSymlink(path string) (bool, error) { ptr, err := syscall.UTF16PtrFromString(path) if err != nil { return false, err } attr, err := syscall.GetFileAttributes(ptr) if err != nil { return false, err } return attr&FILE_ATTRIBUTE_REPARSE_POINT != 0, nil }
func getDir(pathname string) (dir string, err error) { attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) if e != nil { return "", os.NewSyscallError("GetFileAttributes", e) } if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { dir = pathname } else { dir, _ = filepath.Split(pathname) dir = filepath.Clean(dir) } return }
func (t tempNamer) Show(path string) error { p, err := syscall.UTF16PtrFromString(path) if err != nil { return err } attrs, err := syscall.GetFileAttributes(p) if err != nil { return err } attrs &^= syscall.FILE_ATTRIBUTE_HIDDEN return syscall.SetFileAttributes(p, attrs) }
func HideFile(path string) error { p, err := syscall.UTF16PtrFromString(path) if err != nil { return err } attrs, err := syscall.GetFileAttributes(p) if err != nil { return err } attrs |= syscall.FILE_ATTRIBUTE_HIDDEN return syscall.SetFileAttributes(p, attrs) }
func IsHidden(f File) bool { fName := filepath.Base(f.FileName()) if strings.HasPrefix(fName, ".") && len(fName) > 1 { return true } p, e := syscall.UTF16PtrFromString(f.FileName()) if e != nil { return false } attrs, e := syscall.GetFileAttributes(p) if e != nil { return false } return attrs&syscall.FILE_ATTRIBUTE_HIDDEN != 0 }
func (dp DiskPersistor) makeDirectory() error { dir := filepath.Dir(dp.filePath) err := os.MkdirAll(dir, dirPermissions) if err != nil { return err } p, err := syscall.UTF16PtrFromString(dir) if err != nil { return err } attrs, err := syscall.GetFileAttributes(p) if err != nil { return err } return syscall.SetFileAttributes(p, attrs|syscall.FILE_ATTRIBUTE_HIDDEN) }