win_is_writable

The timeline below displays how wordpress function win_is_writable has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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;
}

WordPress Version: 4.6

/**
 * 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 ($f === false) {
        return false;
    }
    fclose($f);
    if ($should_delete_tmp_file) {
        unlink($path);
    }
    return true;
}

WordPress Version: 4.2

/**
 * 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 http://bugs.php.net/bug.php?id=27609
 * @see http://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 ($f === false) {
        return false;
    }
    fclose($f);
    if ($should_delete_tmp_file) {
        unlink($path);
    }
    return true;
}

WordPress Version: 4.0

/**
 * 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 http://bugs.php.net/bug.php?id=27609
 * @see http://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');
    } else if (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 ($f === false) {
        return false;
    }
    fclose($f);
    if ($should_delete_tmp_file) {
        unlink($path);
    }
    return true;
}

WordPress Version: 3.7

/**
 * 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.
 *
 * @link http://bugs.php.net/bug.php?id=27609
 * @link http://bugs.php.net/bug.php?id=30931
 *
 * @since 2.8.0
 *
 * @param string $path
 * @return bool
 */
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');
    } else if (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 ($f === false) {
        return false;
    }
    fclose($f);
    if ($should_delete_tmp_file) {
        unlink($path);
    }
    return true;
}