PHP를 통해 파일을 삭제하는 방법?


174

파일이 다른 디렉토리에있는 경우 PHP로 서버에서 파일을 어떻게 삭제합니까?

내 페이지 레이아웃은 다음과 같습니다.

  • projects/backend/removeProjectData.php (이 파일은 데이터베이스에 대한 모든 항목을 삭제하며 관련 파일도 삭제해야합니다)
  • public_files/22.pdf (파일이있는 장소)

나는 unlink기능을 사용하고 있습니다 :

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

그러나 이것은 항상 파일이 존재하지 않는다는 오류를줍니다. 어떤 아이디어?


2
<pre> 절대 경로 사용 </ pre>
Pavunkumar

1
실제 경로를 사용하여 확인하지 않으면 "."가 표시 될 수 있습니다. 및 ".."파일이 아닌 파일도 존재하지 않습니다.
DrogoNevets

1
그러나 파일에 여러 파일 이름 / 심볼릭 링크가 있으면 파일이 실제로 삭제되지 않을 수 있습니다! 자세한 내용은이 스레드를 참조하십시오. stackoverflow.com/q/17548906/1114320
Sliq

답변:


229

다음은 도움이 될 것입니다

  • realpath — 정규화 된 절대 경로 이름을 반환합니다.
  • is_writable — 파일 이름이 쓰기 가능한지 알려줍니다
  • unlink — 파일을 삭제합니다

realpath를 통해 파일 경로를 실행 한 다음 반환 된 경로가 쓰기 가능한지 확인하고 연결되어 있으면 연결을 해제하십시오.


7
w3shools가 어떻게하고 있는지 궁금합니다. w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@ 고든 죄송합니다 .. 큰 차이를 만드는 잘못된 용어를 사용했습니다 .. 그것은 바보 같은데 동의합니다 .. 그러나 내가 의미하는 것은 코딩 예제가 더 도움이 될 것입니다 .. 만약 내가 세 개의 다른 링크를 방문해야한다면 답장을 이해하는 것이 매우 도움이 되나요? .. 틀린 단어에 대해 다시 죄송합니다. 저는 영어권 국가 출신이 아닙니다 ... 변명 할 수는 없지만 ...
Ritabrata Gautam

13
@RitabrataGautam "응답을 이해하기 위해 세 개의 다른 링크를 방문해야한다면 매우 도움이 되나요?" -네 링크로 이동 한 후에는 작동 방식을 이해했을 것입니다. 코드 만 제공하면 이해하지 못하고 복사하여 붙여 넣기 만하면됩니다. 그때 무엇을 배웠습니까? 아무것도. 게다가, 그 코드는 매우 사소합니다.
고든

1
@ Gordon .. 동의합니다 .. 당신의 견해 요구 존중 .. 당신은 그것을 # 185K를 얻었습니다 .. 단지 두 가지 빠른 질문 ... 1> 내가 답장을 완료 한 것으로 간주하면 왜 많은 중재자가 여기에 코드를 제공해야한다고 말합니까? ... 링크뿐만 아니라 (많은 다운 투표를 유발합니다) ... 2> 코드를 넣으면 더 좋지 않을 것입니다. 학습 경향이있는 사용자는 반드시 해당 링크를 방문하고 준비된 코드를 얻기 위해 Google로 다시 이동하지 않을 사람입니다.
Ritabrata Gautam

2
대답은 나에게 충분히 똑바로 보였다 : 그러나 원하는 코드 예제 : $ path = realpath ( '../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_

103
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}

11
file_exists기능 사용에 대해 투표권이 있습니다. 그렇지 않으면 파일이 존재하지 않으면 오류가 발생합니다.
Mahdi

17

파일에서 먼저 권한을 확인하여 a) 스크립트에서 볼 수 있고 b) 삭제할 수 있는지 확인하십시오.

현재 스크립트를 실행중인 디렉토리에서 계산 된 경로를 사용할 수도 있습니다. 예 :

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

(PHP 5.3에서는 __DIR__상수 대신 사용할 수 있다고 생각 dirname()하지만 아직 직접 사용하지는 않았습니다)


권한을 확인했는데 처음에는 파일을 볼 수 없었지만 이제는 realpath 덕분에 모든 것이 작동합니다. 조언에 감사드립니다
Ken

7

사용하여 파일을 삭제할 수 있습니다

unlink($Your_file_path);

그러나 파일을 http 경로에서 삭제하면이 연결 해제가 제대로 작동하지 않습니다. 올바른 파일 경로를 제공해야합니다.


4

AIO 솔루션은 모든 것을 처리합니다. 그것은 내 일이 아니지만 단지 나 자신을 개선했습니다. 즐겨!

/**
 * 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);
}

완벽 해 보이지만 고마워하지만 unlink기능의 이름으로 사용할 수 없으므로 업데이트하십시오 .
Reham Fahmy

클래스에서 공용 정적 함수 인 경우 unlink는 유효한 함수 이름입니다. 3v4l.org/MgA2l
nadar

예, 그러나 현재 시나리오에서는 독립형이 더 나은 선택입니다.
Junaid Atari

1

나는이 질문이 조금 오래되었다는 것을 알고 있지만 이것은 내가 작업중 인 프로젝트에서 이미지를 삭제하는 데 매우 효과적입니다.

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

dirname(__FILE__)섹션은 프로젝트의 기본 경로를 인쇄합니다. 는 /img/tasks/내 기본 경로에서이 개 폴더를 다운. 마지막으로, 삭제하고 싶은 이미지가 있습니다. 필요한 이미지를 만들 수 있습니다.

이것으로 서버의 파일을 가져 와서 삭제하는 데 아무런 문제가 없었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.