github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/vfs/vfstest/os.go (about) 1 package vfstest 2 3 import ( 4 "os" 5 "time" 6 7 "github.com/rclone/rclone/lib/file" 8 "github.com/rclone/rclone/vfs" 9 ) 10 11 // Oser defines the things that the "os" package can do 12 // 13 // This covers what the VFS can do also 14 type Oser interface { 15 Chtimes(name string, atime time.Time, mtime time.Time) error 16 Create(name string) (vfs.Handle, error) 17 Mkdir(name string, perm os.FileMode) error 18 Open(name string) (vfs.Handle, error) 19 OpenFile(name string, flags int, perm os.FileMode) (fd vfs.Handle, err error) 20 ReadDir(dirname string) ([]os.FileInfo, error) 21 ReadFile(filename string) (b []byte, err error) 22 Remove(name string) error 23 Rename(oldName, newName string) error 24 Stat(path string) (os.FileInfo, error) 25 } 26 27 // realOs is an implementation of Oser backed by the "os" package 28 type realOs struct { 29 } 30 31 // realOsFile is an implementation of vfs.Handle 32 type realOsFile struct { 33 *os.File 34 } 35 36 // Flush 37 func (f realOsFile) Flush() error { 38 return nil 39 } 40 41 // Release 42 func (f realOsFile) Release() error { 43 return f.File.Close() 44 } 45 46 // Node 47 func (f realOsFile) Node() vfs.Node { 48 return nil 49 } 50 51 func (f realOsFile) Lock() error { 52 return os.ErrInvalid 53 } 54 55 func (f realOsFile) Unlock() error { 56 return os.ErrInvalid 57 } 58 59 // Chtimes 60 func (r realOs) Chtimes(name string, atime time.Time, mtime time.Time) error { 61 return os.Chtimes(name, atime, mtime) 62 } 63 64 // Create 65 func (r realOs) Create(name string) (vfs.Handle, error) { 66 fd, err := file.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) 67 if err != nil { 68 return nil, err 69 } 70 return realOsFile{File: fd}, err 71 } 72 73 // Mkdir 74 func (r realOs) Mkdir(name string, perm os.FileMode) error { 75 return os.Mkdir(name, perm) 76 } 77 78 // Open 79 func (r realOs) Open(name string) (vfs.Handle, error) { 80 fd, err := os.Open(name) 81 if err != nil { 82 return nil, err 83 } 84 return realOsFile{File: fd}, err 85 } 86 87 // OpenFile 88 func (r realOs) OpenFile(name string, flags int, perm os.FileMode) (vfs.Handle, error) { 89 fd, err := file.OpenFile(name, flags, perm) 90 if err != nil { 91 return nil, err 92 } 93 return realOsFile{File: fd}, err 94 } 95 96 // ReadDir 97 func (r realOs) ReadDir(dirname string) ([]os.FileInfo, error) { 98 entries, err := os.ReadDir(dirname) 99 if err != nil { 100 return nil, err 101 } 102 infos := make([]os.FileInfo, 0, len(entries)) 103 for _, entry := range entries { 104 info, err := entry.Info() 105 if err != nil { 106 return nil, err 107 } 108 infos = append(infos, info) 109 } 110 return infos, nil 111 } 112 113 // ReadFile 114 func (r realOs) ReadFile(filename string) (b []byte, err error) { 115 return os.ReadFile(filename) 116 } 117 118 // Remove 119 func (r realOs) Remove(name string) error { 120 return os.Remove(name) 121 } 122 123 // Rename 124 func (r realOs) Rename(oldName, newName string) error { 125 return os.Rename(oldName, newName) 126 } 127 128 // Stat 129 func (r realOs) Stat(path string) (os.FileInfo, error) { 130 return os.Stat(path) 131 } 132 133 // Check interfaces 134 var _ Oser = &realOs{} 135 var _ vfs.Handle = &realOsFile{}