Como excluir um arquivo via PHP?

174

Como faço para excluir um arquivo do meu servidor com PHP se o arquivo estiver em outro diretório?

Aqui está o layout da minha página:

  • projects/backend/removeProjectData.php (esse arquivo exclui todas as minhas entradas do banco de dados e também deve excluir o arquivo relacionado)
  • public_files/22.pdf (o local onde o arquivo está localizado.)

Estou usando a unlinkfunção:

unlink('../../public_files/' . $fileName);

Mas isso sempre me dá um erro de que o arquivo não existe. Alguma ideia?

Ken
fonte
2
<pre> Usar caminho absoluto </pre>
Pavunkumar 03/03
1
se você não verificar usando o caminho real, provavelmente receberá o "." e ".." também não-arquivos, causando erros de arquivo não existe
DrogoNevets
1
Mas cuidado, isso pode realmente não excluir o arquivo se ele tiver vários nomes / links simbólicos! Veja esta discussão para obter mais informações: stackoverflow.com/q/17548906/1114320
Sliq

Respostas:

229

O seguinte deve ajudar

  • realpath - Retorna o nome do caminho absoluto canonizado
  • is_writable - Informa se o nome do arquivo é gravável
  • unlink - Exclui um arquivo

Execute o caminho do arquivo pelo caminho real, verifique se o caminho retornado é gravável e, se houver, desvincule-o.

Gordon
fonte
7
Gostaria de saber como o w3shools está fazendo isso? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr
3
@Gordon me desculpe .. eu usei o termo errado, que faz uma grande diferença .. eu concordo que era idiota .. mas o que eu tentei dizer é um exemplo de codificação seria mais útil .. se eu precisar visitar outros três links Para entender sua resposta, é muito útil? ..sorry novamente para a palavra errada .. eu não sou de país de língua Inglês ... embora ele não pode ser uma desculpa ...
Ritabrata Gautam
13
@RitabrataGautam "se eu precisar visitar outros três links para entender sua resposta, isso é muito útil?" - Sim, ele é. Porque depois de acessar os links, você entenderá como funciona. Se eu apenas fornecer os códigos, você não entenderá, apenas copia e cola. O que você aprendeu então? Nada. Além disso, o código para isso é muito trivial.
Gordon
1
@Gordon .. eu concordo .. suas opiniões exigem respeito .. você ganhou # 185K .. apenas duas perguntas rápidas ... 1> se eu considero sua resposta completa, por que muitos moderadores dizem que você deve fornecer também algum código ... não apenas links (isso causa muitos votos negativos) ... 2> não seria melhor se você colocasse algum código. agora quem tem tendência a aprender, certamente visitará esses links e quem não tem, voltará ao google para obter um código pronto.
Ritabrata Gautam 13/09/2015
2
a resposta me pareceu bastante direta: mas o exemplo de código que você queria: $ path = realpath ('../../files_public//'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_
102
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}
UbiQue
fonte
11
votado para cima para usar a file_existsfunção. Caso contrário, você receberá um erro se o arquivo não existir.
Mahdi
17

Antes de tudo, verifique suas permissões no arquivo, para garantir que você pode: a) vê-lo em seu script; eb) consiga excluí-lo.

Você também pode usar um caminho calculado a partir do diretório em que está executando o script, por exemplo:

unlink(dirname(__FILE__) . "/../../public_files/" . $filename);

(no PHP 5.3, acredito que você possa usar a __DIR__constante em vez de, dirname()mas ainda não a usei)

richsage
fonte
Verifiquei as permissões e não consegui ver o arquivo no início, mas agora tudo funciona graças ao caminho real. Obrigado pelo conselho
Ken
7

Você pode excluir o arquivo usando

unlink($Your_file_path);

mas se você estiver excluindo um arquivo do caminho http, esse desassociação não funcionará corretamente. Você precisa fornecer um caminho de arquivo correto.

ankit suthar
fonte
4

AIO solução, lida com tudo, não é meu trabalho, mas eu apenas me aprimorei. Aproveitar!

/**
 * Unlink a file, which handles symlinks.
 * @see https://github.com/luyadev/luya/blob/master/core/helpers/FileHelper.php
 * @param string $filename The file path to the file to delete.
 * @return boolean Whether the file has been removed or not.
 */
function unlinkFile ( $filename ) {
    // try to force symlinks
    if ( is_link ($filename) ) {
        $sym = @readlink ($filename);
        if ( $sym ) {
            return is_writable ($filename) && @unlink ($filename);
        }
    }

    // try to use real path
    if ( realpath ($filename) && realpath ($filename) !== $filename ) {
        return is_writable ($filename) && @unlink (realpath ($filename));
    }

    // default unlink
    return is_writable ($filename) && @unlink ($filename);
}
Junaid Atari
fonte
parece perfeito, muito obrigado, mas atualize-o, pois você não pode usar unlinkcomo nome para sua função.
Reham Fahmy
Se a sua função estático público de uma classe, unlink é um nome de função válido: 3v4l.org/MgA2l
nadar
Sim, mas no cenário atual, o Standalone é uma escolha melhor.
Junaid Atari
1

Sei que essa pergunta é um pouco antiga, mas isso é algo simples que funciona muito bem para excluir imagens do meu projeto em que estou trabalhando.

unlink(dirname(__FILE__) . "/img/tasks/" . 'image.jpg');

A dirname(__FILE__)seção imprime o caminho base para o seu projeto. A /img/tasks/duas pastas para baixo do meu caminho de base. E, finalmente, há a minha imagem que desejo excluir, que você pode transformar em qualquer coisa que precisar.

Com isso, não tive nenhum problema em acessar meus arquivos no servidor e excluí-los.

abetwothree
fonte