run:R W Run
7.85 KB
2026-03-11 16:18:51
R W Run
3.54 KB
2026-03-11 16:18:51
R W Run
148.33 KB
2026-03-11 16:18:51
R W Run
11.45 KB
2026-03-11 16:18:51
R W Run
3.58 KB
2026-03-11 16:18:51
R W Run
2.53 KB
2026-03-11 16:18:51
R W Run
2.6 KB
2026-03-11 16:18:51
R W Run
6.59 KB
2026-03-11 16:18:51
R W Run
14.83 KB
2026-03-11 16:18:51
R W Run
21.18 KB
2026-03-11 16:18:51
R W Run
48.13 KB
2026-03-11 16:18:51
R W Run
4.07 KB
2026-03-11 16:18:51
R W Run
5.3 KB
2026-03-11 16:18:51
R W Run
8.28 KB
2026-03-11 16:18:51
R W Run
26.73 KB
2026-03-11 16:18:51
R W Run
2.8 KB
2026-03-11 16:18:51
R W Run
15.2 KB
2026-03-11 16:18:51
R W Run
192.08 KB
2026-03-11 16:18:51
R W Run
11.77 KB
2026-03-11 16:18:51
R W Run
3.2 KB
2026-03-11 16:18:51
R W Run
22.89 KB
2026-03-11 16:18:51
R W Run
12.77 KB
2026-03-11 16:18:51
R W Run
4.08 KB
2026-03-11 16:18:51
R W Run
26.27 KB
2026-03-11 16:18:51
R W Run
4.97 KB
2026-03-11 16:18:51
R W Run
5.57 KB
2026-03-11 16:18:51
R W Run
13.93 KB
2026-03-11 16:18:51
R W Run
4.09 KB
2026-03-11 16:18:51
R W Run
6.79 KB
2026-03-11 16:18:51
R W Run
60.45 KB
2026-03-11 16:18:51
R W Run
32.4 KB
2026-03-11 16:18:51
R W Run
18.24 KB
2026-03-11 16:18:51
R W Run
66.01 KB
2026-03-11 16:18:51
R W Run
23.84 KB
2026-03-11 16:18:51
R W Run
17.72 KB
2026-03-11 16:18:51
R W Run
22.71 KB
2026-03-11 16:18:51
R W Run
18.05 KB
2026-03-11 16:18:51
R W Run
22.76 KB
2026-03-11 16:18:51
R W Run
7.34 KB
2026-03-11 16:18:51
R W Run
4.51 KB
2026-03-11 16:18:51
R W Run
9.02 KB
2026-03-11 16:18:51
R W Run
1.46 KB
2026-03-11 16:18:51
R W Run
51.76 KB
2026-03-11 16:18:51
R W Run
25.29 KB
2026-03-11 16:18:51
R W Run
21.61 KB
2026-03-11 16:18:51
R W Run
27.77 KB
2026-03-11 16:18:51
R W Run
15.35 KB
2026-03-11 16:18:51
R W Run
24.54 KB
2026-03-11 16:18:51
R W Run
56.44 KB
2026-03-11 16:18:51
R W Run
1.42 KB
2026-03-11 16:18:51
R W Run
63.66 KB
2026-03-11 16:18:51
R W Run
31.9 KB
2026-03-11 16:18:51
R W Run
14.44 KB
2026-03-11 16:18:51
R W Run
36.47 KB
2026-03-11 16:18:51
R W Run
14 KB
2026-03-11 16:18:51
R W Run
121.89 KB
2026-03-11 16:18:51
R W Run
6.26 KB
2026-03-11 16:18:51
R W Run
20.73 KB
2026-03-11 16:18:51
R W Run
15.23 KB
2026-03-11 16:18:51
R W Run
10.14 KB
2026-03-11 16:18:51
R W Run
6.94 KB
2026-03-11 16:18:51
R W Run
1.44 KB
2026-03-11 16:18:51
R W Run
46.85 KB
2026-03-11 16:18:51
R W Run
18.61 KB
2026-03-11 16:18:51
R W Run
6.08 KB
2026-03-11 16:18:51
R W Run
20.06 KB
2026-03-11 16:18:51
R W Run
5.73 KB
2026-03-11 16:18:51
R W Run
68.18 KB
2026-03-11 16:18:51
R W Run
40.8 KB
2026-03-11 16:18:51
R W Run
1.44 KB
2026-03-11 16:18:51
R W Run
25.26 KB
2026-03-11 16:18:51
R W Run
95.94 KB
2026-03-11 16:18:51
R W Run
43.12 KB
2026-03-11 16:18:51
R W Run
41.73 KB
2026-03-11 16:18:51
R W Run
6.46 KB
2026-03-11 16:18:51
R W Run
3.71 KB
2026-03-11 16:18:51
R W Run
116.31 KB
2026-03-11 16:18:51
R W Run
9.39 KB
2026-03-11 16:18:51
R W Run
64.34 KB
2026-03-11 16:18:51
R W Run
44.73 KB
2026-03-11 16:18:51
R W Run
1.27 KB
2026-03-11 16:18:51
R W Run
3.68 KB
2026-03-11 16:18:51
R W Run
33.53 KB
2026-03-11 16:18:51
R W Run
48.84 KB
2026-03-11 16:18:51
R W Run
26.35 KB
2026-03-11 16:18:51
R W Run
1.12 KB
2026-03-11 16:18:51
R W Run
4.19 KB
2026-03-11 16:18:51
R W Run
38.19 KB
2026-03-11 16:18:51
R W Run
91.33 KB
2026-03-11 16:18:51
R W Run
80.39 KB
2026-03-11 16:18:51
R W Run
32.67 KB
2026-03-11 16:18:51
R W Run
16.18 KB
2026-03-11 16:18:51
R W Run
44.46 KB
2026-03-11 16:18:51
R W Run
6.23 KB
2026-03-11 16:18:51
R W Run
8.23 KB
2026-03-11 16:18:51
R W Run
96.96 KB
2026-03-11 16:18:51
R W Run
6.83 KB
2026-03-11 16:18:51
R W Run
46.62 KB
2026-03-11 16:18:51
R W Run
10.82 KB
2026-03-11 16:18:51
R W Run
68.86 KB
2026-03-11 16:18:51
R W Run
33.63 KB
2026-03-11 16:18:51
R W Run
113.3 KB
2026-03-11 16:18:51
R W Run
22.98 KB
2026-03-11 16:18:51
R W Run
10.66 KB
2026-03-11 16:18:51
R W Run
error_log
📄class-wp-filesystem-base.php
1<?php
2/**
3 * Base WordPress Filesystem
4 *
5 * @package WordPress
6 * @subpackage Filesystem
7 */
8
9/**
10 * Base WordPress Filesystem class which Filesystem implementations extend.
11 *
12 * @since 2.5.0
13 */
14#[AllowDynamicProperties]
15class WP_Filesystem_Base {
16
17 /**
18 * Whether to display debug data for the connection.
19 *
20 * @since 2.5.0
21 * @var bool
22 */
23 public $verbose = false;
24
25 /**
26 * Cached list of local filepaths to mapped remote filepaths.
27 *
28 * @since 2.7.0
29 * @var array
30 */
31 public $cache = array();
32
33 /**
34 * The Access method of the current connection, Set automatically.
35 *
36 * @since 2.5.0
37 * @var string
38 */
39 public $method = '';
40
41 /**
42 * @var WP_Error
43 */
44 public $errors = null;
45
46 /**
47 */
48 public $options = array();
49
50 /**
51 * Returns the path on the remote filesystem of ABSPATH.
52 *
53 * @since 2.7.0
54 *
55 * @return string The location of the remote path.
56 */
57 public function abspath() {
58 $folder = $this->find_folder( ABSPATH );
59
60 /*
61 * Perhaps the FTP folder is rooted at the WordPress install.
62 * Check for wp-includes folder in root. Could have some false positives, but rare.
63 */
64 if ( ! $folder && $this->is_dir( '/' . WPINC ) ) {
65 $folder = '/';
66 }
67
68 return $folder;
69 }
70
71 /**
72 * Returns the path on the remote filesystem of WP_CONTENT_DIR.
73 *
74 * @since 2.7.0
75 *
76 * @return string The location of the remote path.
77 */
78 public function wp_content_dir() {
79 return $this->find_folder( WP_CONTENT_DIR );
80 }
81
82 /**
83 * Returns the path on the remote filesystem of WP_PLUGIN_DIR.
84 *
85 * @since 2.7.0
86 *
87 * @return string The location of the remote path.
88 */
89 public function wp_plugins_dir() {
90 return $this->find_folder( WP_PLUGIN_DIR );
91 }
92
93 /**
94 * Returns the path on the remote filesystem of the Themes Directory.
95 *
96 * @since 2.7.0
97 *
98 * @param string|false $theme Optional. The theme stylesheet or template for the directory.
99 * Default false.
100 * @return string The location of the remote path.
101 */
102 public function wp_themes_dir( $theme = false ) {
103 $theme_root = get_theme_root( $theme );
104
105 // Account for relative theme roots.
106 if ( '/themes' === $theme_root || ! is_dir( $theme_root ) ) {
107 $theme_root = WP_CONTENT_DIR . $theme_root;
108 }
109
110 return $this->find_folder( $theme_root );
111 }
112
113 /**
114 * Returns the path on the remote filesystem of WP_LANG_DIR.
115 *
116 * @since 3.2.0
117 *
118 * @return string The location of the remote path.
119 */
120 public function wp_lang_dir() {
121 return $this->find_folder( WP_LANG_DIR );
122 }
123
124 /**
125 * Locates a folder on the remote filesystem.
126 *
127 * @since 2.5.0
128 * @deprecated 2.7.0 use WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir() instead.
129 * @see WP_Filesystem_Base::abspath()
130 * @see WP_Filesystem_Base::wp_content_dir()
131 * @see WP_Filesystem_Base::wp_plugins_dir()
132 * @see WP_Filesystem_Base::wp_themes_dir()
133 * @see WP_Filesystem_Base::wp_lang_dir()
134 *
135 * @param string $base Optional. The folder to start searching from. Default '.'.
136 * @param bool $verbose Optional. True to display debug information. Default false.
137 * @return string The location of the remote path.
138 */
139 public function find_base_dir( $base = '.', $verbose = false ) {
140 _deprecated_function( __FUNCTION__, '2.7.0', 'WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir()' );
141 $this->verbose = $verbose;
142 return $this->abspath();
143 }
144
145 /**
146 * Locates a folder on the remote filesystem.
147 *
148 * @since 2.5.0
149 * @deprecated 2.7.0 use WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir() methods instead.
150 * @see WP_Filesystem_Base::abspath()
151 * @see WP_Filesystem_Base::wp_content_dir()
152 * @see WP_Filesystem_Base::wp_plugins_dir()
153 * @see WP_Filesystem_Base::wp_themes_dir()
154 * @see WP_Filesystem_Base::wp_lang_dir()
155 *
156 * @param string $base Optional. The folder to start searching from. Default '.'.
157 * @param bool $verbose Optional. True to display debug information. Default false.
158 * @return string The location of the remote path.
159 */
160 public function get_base_dir( $base = '.', $verbose = false ) {
161 _deprecated_function( __FUNCTION__, '2.7.0', 'WP_Filesystem_Base::abspath() or WP_Filesystem_Base::wp_*_dir()' );
162 $this->verbose = $verbose;
163 return $this->abspath();
164 }
165
166 /**
167 * Locates a folder on the remote filesystem.
168 *
169 * Assumes that on Windows systems, Stripping off the Drive
170 * letter is OK Sanitizes \\ to / in Windows filepaths.
171 *
172 * @since 2.7.0
173 *
174 * @param string $folder the folder to locate.
175 * @return string|false The location of the remote path, false on failure.
176 */
177 public function find_folder( $folder ) {
178 if ( isset( $this->cache[ $folder ] ) ) {
179 return $this->cache[ $folder ];
180 }
181
182 if ( stripos( $this->method, 'ftp' ) !== false ) {
183 $constant_overrides = array(
184 'FTP_BASE' => ABSPATH,
185 'FTP_CONTENT_DIR' => WP_CONTENT_DIR,
186 'FTP_PLUGIN_DIR' => WP_PLUGIN_DIR,
187 'FTP_LANG_DIR' => WP_LANG_DIR,
188 );
189
190 // Direct matches ( folder = CONSTANT/ ).
191 foreach ( $constant_overrides as $constant => $dir ) {
192 if ( ! defined( $constant ) ) {
193 continue;
194 }
195
196 if ( $folder === $dir ) {
197 return trailingslashit( constant( $constant ) );
198 }
199 }
200
201 // Prefix matches ( folder = CONSTANT/subdir ),
202 foreach ( $constant_overrides as $constant => $dir ) {
203 if ( ! defined( $constant ) ) {
204 continue;
205 }
206
207 if ( 0 === stripos( $folder, $dir ) ) { // $folder starts with $dir.
208 $potential_folder = preg_replace( '#^' . preg_quote( $dir, '#' ) . '/#i', trailingslashit( constant( $constant ) ), $folder );
209 $potential_folder = trailingslashit( $potential_folder );
210
211 if ( $this->is_dir( $potential_folder ) ) {
212 $this->cache[ $folder ] = $potential_folder;
213
214 return $potential_folder;
215 }
216 }
217 }
218 } elseif ( 'direct' === $this->method ) {
219 $folder = str_replace( '\\', '/', $folder ); // Windows path sanitization.
220
221 return trailingslashit( $folder );
222 }
223
224 $folder = preg_replace( '|^([a-z]{1}):|i', '', $folder ); // Strip out Windows drive letter if it's there.
225 $folder = str_replace( '\\', '/', $folder ); // Windows path sanitization.
226
227 if ( isset( $this->cache[ $folder ] ) ) {
228 return $this->cache[ $folder ];
229 }
230
231 if ( $this->exists( $folder ) ) { // Folder exists at that absolute path.
232 $folder = trailingslashit( $folder );
233 $this->cache[ $folder ] = $folder;
234
235 return $folder;
236 }
237
238 $return = $this->search_for_folder( $folder );
239
240 if ( $return ) {
241 $this->cache[ $folder ] = $return;
242 }
243
244 return $return;
245 }
246
247 /**
248 * Locates a folder on the remote filesystem.
249 *
250 * Expects Windows sanitized path.
251 *
252 * @since 2.7.0
253 *
254 * @param string $folder The folder to locate.
255 * @param string $base The folder to start searching from.
256 * @param bool $loop If the function has recursed. Internal use only.
257 * @return string|false The location of the remote path, false to cease looping.
258 */
259 public function search_for_folder( $folder, $base = '.', $loop = false ) {
260 if ( empty( $base ) || '.' === $base ) {
261 $base = trailingslashit( $this->cwd() );
262 }
263
264 $folder = untrailingslashit( $folder );
265
266 if ( $this->verbose ) {
267 /* translators: 1: Folder to locate, 2: Folder to start searching from. */
268 printf( "\n" . __( 'Looking for %1$s in %2$s' ) . "<br />\n", $folder, $base );
269 }
270
271 $folder_parts = explode( '/', $folder );
272 $folder_part_keys = array_keys( $folder_parts );
273 $last_index = array_pop( $folder_part_keys );
274 $last_path = $folder_parts[ $last_index ];
275
276 $files = $this->dirlist( $base );
277
278 foreach ( $folder_parts as $index => $key ) {
279 if ( $index === $last_index ) {
280 continue; // We want this to be caught by the next code block.
281 }
282
283 /*
284 * Working from /home/ to /user/ to /wordpress/ see if that file exists within
285 * the current folder, If it's found, change into it and follow through looking
286 * for it. If it can't find WordPress down that route, it'll continue onto the next
287 * folder level, and see if that matches, and so on. If it reaches the end, and still
288 * can't find it, it'll return false for the entire function.
289 */
290 if ( isset( $files[ $key ] ) ) {
291
292 // Let's try that folder:
293 $newdir = trailingslashit( path_join( $base, $key ) );
294
295 if ( $this->verbose ) {
296 /* translators: %s: Directory name. */
297 printf( "\n" . __( 'Changing to %s' ) . "<br />\n", $newdir );
298 }
299
300 // Only search for the remaining path tokens in the directory, not the full path again.
301 $newfolder = implode( '/', array_slice( $folder_parts, $index + 1 ) );
302 $ret = $this->search_for_folder( $newfolder, $newdir, $loop );
303
304 if ( $ret ) {
305 return $ret;
306 }
307 }
308 }
309
310 /*
311 * Only check this as a last resort, to prevent locating the incorrect install.
312 * All above procedures will fail quickly if this is the right branch to take.
313 */
314 if ( isset( $files[ $last_path ] ) ) {
315 if ( $this->verbose ) {
316 /* translators: %s: Directory name. */
317 printf( "\n" . __( 'Found %s' ) . "<br />\n", $base . $last_path );
318 }
319
320 return trailingslashit( $base . $last_path );
321 }
322
323 /*
324 * Prevent this function from looping again.
325 * No need to proceed if we've just searched in `/`.
326 */
327 if ( $loop || '/' === $base ) {
328 return false;
329 }
330
331 /*
332 * As an extra last resort, Change back to / if the folder wasn't found.
333 * This comes into effect when the CWD is /home/user/ but WP is at /var/www/....
334 */
335 return $this->search_for_folder( $folder, '/', true );
336 }
337
338 /**
339 * Returns the *nix-style file permissions for a file.
340 *
341 * From the PHP documentation page for fileperms().
342 *
343 * @link https://www.php.net/manual/en/function.fileperms.php
344 *
345 * @since 2.5.0
346 *
347 * @param string $file String filename.
348 * @return string The *nix-style representation of permissions.
349 */
350 public function gethchmod( $file ) {
351 $perms = intval( $this->getchmod( $file ), 8 );
352
353 if ( ( $perms & 0xC000 ) === 0xC000 ) { // Socket.
354 $info = 's';
355 } elseif ( ( $perms & 0xA000 ) === 0xA000 ) { // Symbolic Link.
356 $info = 'l';
357 } elseif ( ( $perms & 0x8000 ) === 0x8000 ) { // Regular.
358 $info = '-';
359 } elseif ( ( $perms & 0x6000 ) === 0x6000 ) { // Block special.
360 $info = 'b';
361 } elseif ( ( $perms & 0x4000 ) === 0x4000 ) { // Directory.
362 $info = 'd';
363 } elseif ( ( $perms & 0x2000 ) === 0x2000 ) { // Character special.
364 $info = 'c';
365 } elseif ( ( $perms & 0x1000 ) === 0x1000 ) { // FIFO pipe.
366 $info = 'p';
367 } else { // Unknown.
368 $info = 'u';
369 }
370
371 // Owner.
372 $info .= ( ( $perms & 0x0100 ) ? 'r' : '-' );
373 $info .= ( ( $perms & 0x0080 ) ? 'w' : '-' );
374 $info .= ( ( $perms & 0x0040 ) ?
375 ( ( $perms & 0x0800 ) ? 's' : 'x' ) :
376 ( ( $perms & 0x0800 ) ? 'S' : '-' ) );
377
378 // Group.
379 $info .= ( ( $perms & 0x0020 ) ? 'r' : '-' );
380 $info .= ( ( $perms & 0x0010 ) ? 'w' : '-' );
381 $info .= ( ( $perms & 0x0008 ) ?
382 ( ( $perms & 0x0400 ) ? 's' : 'x' ) :
383 ( ( $perms & 0x0400 ) ? 'S' : '-' ) );
384
385 // World.
386 $info .= ( ( $perms & 0x0004 ) ? 'r' : '-' );
387 $info .= ( ( $perms & 0x0002 ) ? 'w' : '-' );
388 $info .= ( ( $perms & 0x0001 ) ?
389 ( ( $perms & 0x0200 ) ? 't' : 'x' ) :
390 ( ( $perms & 0x0200 ) ? 'T' : '-' ) );
391
392 return $info;
393 }
394
395 /**
396 * Gets the permissions of the specified file or filepath in their octal format.
397 *
398 * @since 2.5.0
399 *
400 * @param string $file Path to the file.
401 * @return string Mode of the file (the last 3 digits).
402 */
403 public function getchmod( $file ) {
404 return '777';
405 }
406
407 /**
408 * Converts *nix-style file permissions to an octal number.
409 *
410 * Converts '-rw-r--r--' to 0644
411 * From "info at rvgate dot nl"'s comment on the PHP documentation for chmod()
412 *
413 * @link https://www.php.net/manual/en/function.chmod.php#49614
414 *
415 * @since 2.5.0
416 *
417 * @param string $mode string The *nix-style file permissions.
418 * @return string Octal representation of permissions.
419 */
420 public function getnumchmodfromh( $mode ) {
421 $realmode = '';
422 $legal = array( '', 'w', 'r', 'x', '-' );
423 $attarray = preg_split( '//', $mode );
424
425 for ( $i = 0, $c = count( $attarray ); $i < $c; $i++ ) {
426 $key = array_search( $attarray[ $i ], $legal, true );
427
428 if ( $key ) {
429 $realmode .= $legal[ $key ];
430 }
431 }
432
433 $mode = str_pad( $realmode, 10, '-', STR_PAD_LEFT );
434 $trans = array(
435 '-' => '0',
436 'r' => '4',
437 'w' => '2',
438 'x' => '1',
439 );
440 $mode = strtr( $mode, $trans );
441
442 $newmode = $mode[0];
443 $newmode .= $mode[1] + $mode[2] + $mode[3];
444 $newmode .= $mode[4] + $mode[5] + $mode[6];
445 $newmode .= $mode[7] + $mode[8] + $mode[9];
446
447 return $newmode;
448 }
449
450 /**
451 * Determines if the string provided contains binary characters.
452 *
453 * @since 2.7.0
454 *
455 * @param string $text String to test against.
456 * @return bool True if string is binary, false otherwise.
457 */
458 public function is_binary( $text ) {
459 return (bool) preg_match( '|[^\x20-\x7E]|', $text ); // chr(32)..chr(127)
460 }
461
462 /**
463 * Changes the owner of a file or directory.
464 *
465 * Default behavior is to do nothing, override this in your subclass, if desired.
466 *
467 * @since 2.5.0
468 *
469 * @param string $file Path to the file or directory.
470 * @param string|int $owner A user name or number.
471 * @param bool $recursive Optional. If set to true, changes file owner recursively.
472 * Default false.
473 * @return bool True on success, false on failure.
474 */
475 public function chown( $file, $owner, $recursive = false ) {
476 return false;
477 }
478
479 /**
480 * Connects filesystem.
481 *
482 * @since 2.5.0
483 * @abstract
484 *
485 * @return bool True on success, false on failure (always true for WP_Filesystem_Direct).
486 */
487 public function connect() {
488 return true;
489 }
490
491 /**
492 * Reads entire file into a string.
493 *
494 * @since 2.5.0
495 * @abstract
496 *
497 * @param string $file Name of the file to read.
498 * @return string|false Read data on success, false on failure.
499 */
500 public function get_contents( $file ) {
501 return false;
502 }
503
504 /**
505 * Reads entire file into an array.
506 *
507 * @since 2.5.0
508 * @abstract
509 *
510 * @param string $file Path to the file.
511 * @return array|false File contents in an array on success, false on failure.
512 */
513 public function get_contents_array( $file ) {
514 return false;
515 }
516
517 /**
518 * Writes a string to a file.
519 *
520 * @since 2.5.0
521 * @abstract
522 *
523 * @param string $file Remote path to the file where to write the data.
524 * @param string $contents The data to write.
525 * @param int|false $mode Optional. The file permissions as octal number, usually 0644.
526 * Default false.
527 * @return bool True on success, false on failure.
528 */
529 public function put_contents( $file, $contents, $mode = false ) {
530 return false;
531 }
532
533 /**
534 * Gets the current working directory.
535 *
536 * @since 2.5.0
537 * @abstract
538 *
539 * @return string|false The current working directory on success, false on failure.
540 */
541 public function cwd() {
542 return false;
543 }
544
545 /**
546 * Changes current directory.
547 *
548 * @since 2.5.0
549 * @abstract
550 *
551 * @param string $dir The new current directory.
552 * @return bool True on success, false on failure.
553 */
554 public function chdir( $dir ) {
555 return false;
556 }
557
558 /**
559 * Changes the file group.
560 *
561 * @since 2.5.0
562 * @abstract
563 *
564 * @param string $file Path to the file.
565 * @param string|int $group A group name or number.
566 * @param bool $recursive Optional. If set to true, changes file group recursively.
567 * Default false.
568 * @return bool True on success, false on failure.
569 */
570 public function chgrp( $file, $group, $recursive = false ) {
571 return false;
572 }
573
574 /**
575 * Changes filesystem permissions.
576 *
577 * @since 2.5.0
578 * @abstract
579 *
580 * @param string $file Path to the file.
581 * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files,
582 * 0755 for directories. Default false.
583 * @param bool $recursive Optional. If set to true, changes file permissions recursively.
584 * Default false.
585 * @return bool True on success, false on failure.
586 */
587 public function chmod( $file, $mode = false, $recursive = false ) {
588 return false;
589 }
590
591 /**
592 * Gets the file owner.
593 *
594 * @since 2.5.0
595 * @abstract
596 *
597 * @param string $file Path to the file.
598 * @return string|false Username of the owner on success, false on failure.
599 */
600 public function owner( $file ) {
601 return false;
602 }
603
604 /**
605 * Gets the file's group.
606 *
607 * @since 2.5.0
608 * @abstract
609 *
610 * @param string $file Path to the file.
611 * @return string|false The group on success, false on failure.
612 */
613 public function group( $file ) {
614 return false;
615 }
616
617 /**
618 * Copies a file.
619 *
620 * @since 2.5.0
621 * @abstract
622 *
623 * @param string $source Path to the source file.
624 * @param string $destination Path to the destination file.
625 * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists.
626 * Default false.
627 * @param int|false $mode Optional. The permissions as octal number, usually 0644 for files,
628 * 0755 for dirs. Default false.
629 * @return bool True on success, false on failure.
630 */
631 public function copy( $source, $destination, $overwrite = false, $mode = false ) {
632 return false;
633 }
634
635 /**
636 * Moves a file.
637 *
638 * @since 2.5.0
639 * @abstract
640 *
641 * @param string $source Path to the source file.
642 * @param string $destination Path to the destination file.
643 * @param bool $overwrite Optional. Whether to overwrite the destination file if it exists.
644 * Default false.
645 * @return bool True on success, false on failure.
646 */
647 public function move( $source, $destination, $overwrite = false ) {
648 return false;
649 }
650
651 /**
652 * Deletes a file or directory.
653 *
654 * @since 2.5.0
655 * @abstract
656 *
657 * @param string $file Path to the file or directory.
658 * @param bool $recursive Optional. If set to true, deletes files and folders recursively.
659 * Default false.
660 * @param string|false $type Type of resource. 'f' for file, 'd' for directory.
661 * Default false.
662 * @return bool True on success, false on failure.
663 */
664 public function delete( $file, $recursive = false, $type = false ) {
665 return false;
666 }
667
668 /**
669 * Checks if a file or directory exists.
670 *
671 * @since 2.5.0
672 * @abstract
673 *
674 * @param string $path Path to file or directory.
675 * @return bool Whether $path exists or not.
676 */
677 public function exists( $path ) {
678 return false;
679 }
680
681 /**
682 * Checks if resource is a file.
683 *
684 * @since 2.5.0
685 * @abstract
686 *
687 * @param string $file File path.
688 * @return bool Whether $file is a file.
689 */
690 public function is_file( $file ) {
691 return false;
692 }
693
694 /**
695 * Checks if resource is a directory.
696 *
697 * @since 2.5.0
698 * @abstract
699 *
700 * @param string $path Directory path.
701 * @return bool Whether $path is a directory.
702 */
703 public function is_dir( $path ) {
704 return false;
705 }
706
707 /**
708 * Checks if a file is readable.
709 *
710 * @since 2.5.0
711 * @abstract
712 *
713 * @param string $file Path to file.
714 * @return bool Whether $file is readable.
715 */
716 public function is_readable( $file ) {
717 return false;
718 }
719
720 /**
721 * Checks if a file or directory is writable.
722 *
723 * @since 2.5.0
724 * @abstract
725 *
726 * @param string $path Path to file or directory.
727 * @return bool Whether $path is writable.
728 */
729 public function is_writable( $path ) {
730 return false;
731 }
732
733 /**
734 * Gets the file's last access time.
735 *
736 * @since 2.5.0
737 * @abstract
738 *
739 * @param string $file Path to file.
740 * @return int|false Unix timestamp representing last access time, false on failure.
741 */
742 public function atime( $file ) {
743 return false;
744 }
745
746 /**
747 * Gets the file modification time.
748 *
749 * @since 2.5.0
750 * @abstract
751 *
752 * @param string $file Path to file.
753 * @return int|false Unix timestamp representing modification time, false on failure.
754 */
755 public function mtime( $file ) {
756 return false;
757 }
758
759 /**
760 * Gets the file size (in bytes).
761 *
762 * @since 2.5.0
763 * @abstract
764 *
765 * @param string $file Path to file.
766 * @return int|false Size of the file in bytes on success, false on failure.
767 */
768 public function size( $file ) {
769 return false;
770 }
771
772 /**
773 * Sets the access and modification times of a file.
774 *
775 * Note: If $file doesn't exist, it will be created.
776 *
777 * @since 2.5.0
778 * @abstract
779 *
780 * @param string $file Path to file.
781 * @param int $time Optional. Modified time to set for file.
782 * Default 0.
783 * @param int $atime Optional. Access time to set for file.
784 * Default 0.
785 * @return bool True on success, false on failure.
786 */
787 public function touch( $file, $time = 0, $atime = 0 ) {
788 return false;
789 }
790
791 /**
792 * Creates a directory.
793 *
794 * @since 2.5.0
795 * @abstract
796 *
797 * @param string $path Path for new directory.
798 * @param int|false $chmod Optional. The permissions as octal number (or false to skip chmod).
799 * Default false.
800 * @param string|int|false $chown Optional. A user name or number (or false to skip chown).
801 * Default false.
802 * @param string|int|false $chgrp Optional. A group name or number (or false to skip chgrp).
803 * Default false.
804 * @return bool True on success, false on failure.
805 */
806 public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {
807 return false;
808 }
809
810 /**
811 * Deletes a directory.
812 *
813 * @since 2.5.0
814 * @abstract
815 *
816 * @param string $path Path to directory.
817 * @param bool $recursive Optional. Whether to recursively remove files/directories.
818 * Default false.
819 * @return bool True on success, false on failure.
820 */
821 public function rmdir( $path, $recursive = false ) {
822 return false;
823 }
824
825 /**
826 * Gets details for files in a directory or a specific file.
827 *
828 * @since 2.5.0
829 * @abstract
830 *
831 * @param string $path Path to directory or file.
832 * @param bool $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
833 * Default true.
834 * @param bool $recursive Optional. Whether to recursively include file details in nested directories.
835 * Default false.
836 * @return array|false {
837 * Array of arrays containing file information. False if unable to list directory contents.
838 *
839 * @type array ...$0 {
840 * Array of file information. Note that some elements may not be available on all filesystems.
841 *
842 * @type string $name Name of the file or directory.
843 * @type string $perms *nix representation of permissions.
844 * @type string $permsn Octal representation of permissions.
845 * @type int|string|false $number File number. May be a numeric string. False if not available.
846 * @type string|false $owner Owner name or ID, or false if not available.
847 * @type string|false $group File permissions group, or false if not available.
848 * @type int|string|false $size Size of file in bytes. May be a numeric string.
849 * False if not available.
850 * @type int|string|false $lastmodunix Last modified unix timestamp. May be a numeric string.
851 * False if not available.
852 * @type string|false $lastmod Last modified month (3 letters) and day (without leading 0), or
853 * false if not available.
854 * @type string|false $time Last modified time, or false if not available.
855 * @type string $type Type of resource. 'f' for file, 'd' for directory, 'l' for link.
856 * @type array|false $files If a directory and `$recursive` is true, contains another array of
857 * files. False if unable to list directory contents.
858 * }
859 * }
860 */
861 public function dirlist( $path, $include_hidden = true, $recursive = false ) {
862 return false;
863 }
864}
865