Explicando em miúdos:
Queria simplesmente renomear um arquivo que estava em um caminho parecido com esse aqui:
/home/storage/userxpto/public_html/pastax/pastay/documentos/documento.doc
Acontece que o meu script PHP estava em um caminho como esse aqui:
/home/storage/userxpto/public_html/sistema_xpto/meuscript.php
Ao executar o comando file_exists(/home/storage/userxpto/public_html/pastax/pastay/documentos/documento.doc) do PHP, sempre recebia um erro por falta de permissão. Daí descobri que não conseguia sequer listar o conteúdo da pasta /home/storage na Locaweb (óbvio que por quest~~oes de segurança da própria Locaweb). A solução foi passar o caminho relativo entre o meu script PHP 'meuscript.php' e o documento 'documento.doc' para o comando 'file_exists'.
Como desconheço uma função em PHP que obtenha o caminho relativo entre dois paths, eu precisei implementar a criança.
Segue o código abaixo:
/***
getRelativePath obtém o caminho relativo entre dois caminhos de diretórios.
Ex: $path1 = "/a/b/c/d/e/f/g";
$path2 = "/a/b/c/d/x/y/z";
echo "Relative = ".getRelative($path1, $path2);
//Resultado: ..\..\..\x\y\z
*/
function getRelativePath($path1, $path2){
$p1 = $p2 = "";
//Obtendo o ponto de diferença entre os paths
$i=0;
while($path1[$i] == $path2[$i]) $i++;
$p1 = substr($path1, $i);
$p1 = preg_replace("@[^\\\/]+@", "..", $p1);
$p1 = preg_replace("@[\\\/]@", DIRECTORY_SEPARATOR, $p1);
$p2 = substr($path2, $i);
$p2 = preg_replace("@[\\\/]@", DIRECTORY_SEPARATOR, $p2);
return $p1.DIRECTORY_SEPARATOR.$p2;
}
getRelativePath obtém o caminho relativo entre dois caminhos de diretórios.
Ex: $path1 = "/a/b/c/d/e/f/g";
$path2 = "/a/b/c/d/x/y/z";
echo "Relative = ".getRelative($path1, $path2);
//Resultado: ..\..\..\x\y\z
*/
function getRelativePath($path1, $path2){
$p1 = $p2 = "";
//Obtendo o ponto de diferença entre os paths
$i=0;
while($path1[$i] == $path2[$i]) $i++;
$p1 = substr($path1, $i);
$p1 = preg_replace("@[^\\\/]+@", "..", $p1);
$p1 = preg_replace("@[\\\/]@", DIRECTORY_SEPARATOR, $p1);
$p2 = substr($path2, $i);
$p2 = preg_replace("@[\\\/]@", DIRECTORY_SEPARATOR, $p2);
return $p1.DIRECTORY_SEPARATOR.$p2;
}
Espero que seja útil pra mais alguém!
Nenhum comentário:
Postar um comentário