У меня есть следующая функция, которую я использую, чтобы проверить, доступен ли каталог для записи или нет.
/**
* check if the path is writable. if the path is a folder it creates a test file.
*
* @param string $path
* @return boolean
*/
public static function is_writable( $path ) {
//will work in despite of Windows ACLs bug
//NOTE: use a trailing slash for folders!!!
//see http://bugs.php.net/bug.php?id=27609
//see http://bugs.php.net/bug.php?id=30931
if ( $path{strlen($path)-1} === DIRECTORY_SEPARATOR ) {// recursively return a temporary file path
return self::is_writable( $path . uniqid( mt_rand() ) . '.tmp' );
} else if ( is_dir( $path ) ) {
return self::is_writable( $path . DIRECTORY_SEPARATOR . uniqid( mt_rand() ) . '.tmp' );
}
$file_already_exists = file_exists( $path );
// check tmp file for read/write capabilities
$f = @fopen( $path, 'a');
if ( $f === false ) {
return false;
}
if ( ! $file_already_exists ) {
unlink( $path );
}
return true;
}
Это всегда работало нормально, до недавнего времени я всегда получал предупреждение, так как unlink() не имеет разрешения на удаление файла. Но временный файл создается нормально, поэтому я могу писать в каталог.
Предупреждение: unlink (C:\Program Files (x86)\Zend\Apache2\htdocs\wordpress\wp-content\plugins\all-in-one-event-calendar-premium\cache\152006398050813468bb6ec.tmp) [function.unlink] : Доступ запрещен в C:\Program Files (x86)\Zend\Apache2\htdocs\wordpress\wp-content\plugins\all-in-one-event-calendar-premium\lib\utility\class-ai1ec-filesystem-utility .php в строке 35
Как это возможно? Я пытался указать 777 в тестируемом каталоге, но все равно получаю предупреждение! Я на Windows 7 с сервером Zend
chmod()не имеет смысла в Windows. Вместо этого вам нужно перейти к папке в проводнике, щелкнуть правой кнопкой мыши -> свойства -> вкладка безопасности -> найти пользователя Zend server, который работает, как в списке -> убедиться, что у него есть разрешенияmodifyиwrite. - person DaveRandom   schedule 19.10.2012fclose(), я только что заметил, что вы оставили указатель файла открытым, может быть, это причина? Также рассмотрите возможность использованияtouch(), если все, что вы хотите сделать, это определить, можете ли вы для создания файла. - person DaveRandom   schedule 19.10.2012