MCPcopy
hub / github.com/filebrowser/filebrowser / stat

Function stat

files/file.go:109–166  ·  view source on GitHub ↗
(opts *FileOptions)

Source from the content-addressed store, hash-verified

107}
108
109func stat(opts *FileOptions) (*FileInfo, error) {
110 var file *FileInfo
111
112 if lstaterFs, ok := opts.Fs.(afero.Lstater); ok {
113 info, _, err := lstaterFs.LstatIfPossible(opts.Path)
114 if err != nil {
115 return nil, err
116 }
117 file = &FileInfo{
118 Fs: opts.Fs,
119 Path: opts.Path,
120 Name: info.Name(),
121 ModTime: info.ModTime(),
122 Mode: info.Mode(),
123 IsDir: info.IsDir(),
124 IsSymlink: IsSymlink(info.Mode()),
125 Size: info.Size(),
126 Extension: filepath.Ext(info.Name()),
127 Token: opts.Token,
128 }
129 }
130
131 // regular file
132 if file != nil && !file.IsSymlink {
133 return file, nil
134 }
135
136 // fs doesn't support afero.Lstater interface or the file is a symlink
137 info, err := opts.Fs.Stat(opts.Path)
138 if err != nil {
139 // can't follow symlink
140 if file != nil && file.IsSymlink {
141 return file, nil
142 }
143 return nil, err
144 }
145
146 // set correct file size in case of symlink
147 if file != nil && file.IsSymlink {
148 file.Size = info.Size()
149 file.IsDir = info.IsDir()
150 return file, nil
151 }
152
153 file = &FileInfo{
154 Fs: opts.Fs,
155 Path: opts.Path,
156 Name: info.Name(),
157 ModTime: info.ModTime(),
158 Mode: info.Mode(),
159 IsDir: info.IsDir(),
160 Size: info.Size(),
161 Extension: filepath.Ext(info.Name()),
162 Token: opts.Token,
163 }
164
165 return file, nil
166}

Callers 2

NewFileInfoFunction · 0.85

Calls 4

IsSymlinkFunction · 0.85
NameMethod · 0.80
LstatIfPossibleMethod · 0.45
StatMethod · 0.45

Tested by 1