WordPress Version: 5.4
/**
* Workaround for Windows bug in is_writable() function
*
* PHP has issues with Windows ACL's for determine if a
* directory is writable or not, this works around them by
* checking the ability to open files rather than relying
* upon PHP to interprate the OS ACL.
*
* @since 2.8.0
*
* @see https://bugs.php.net/bug.php?id=27609
* @see https://bugs.php.net/bug.php?id=30931
*
* @param string $path Windows path to check for write-ability.
* @return bool Whether the path is writable.
*/
function win_is_writable($path)
{
if ('/' === $path[strlen($path) - 1]) {
// If it looks like a directory, check a random file within the directory.
return win_is_writable($path . uniqid(mt_rand()) . '.tmp');
} elseif (is_dir($path)) {
// If it's a directory (and not a file), check a random file within the directory.
return win_is_writable($path . '/' . uniqid(mt_rand()) . '.tmp');
}
// Check tmp file for read/write capabilities.
$should_delete_tmp_file = !file_exists($path);
$f = @fopen($path, 'a');
if (false === $f) {
return false;
}
fclose($f);
if ($should_delete_tmp_file) {
unlink($path);
}
return true;
}