현재 위치: > 최신 기사 목록> IS_DIR () 함수로 디렉토리를 판단 할 때 소프트 링크로 오해되는 것을 피하는 방법?

IS_DIR () 함수로 디렉토리를 판단 할 때 소프트 링크로 오해되는 것을 피하는 방법?

M66 2025-06-26

IS_DIR () 함수로 디렉토리를 판단 할 때 소프트 링크로 오해되는 것을 피하는 방법?

PHP 개발에서 is_dir () 함수는 종종 경로가 디렉토리인지 여부를 결정하는 데 사용됩니다. 그 기능은 매우 간단하지만 경우에 따라, 특히 소프트 링크와 관련하여 is_dir ()는 일부 오해의 소지가있는 결과를 초래할 수 있습니다. 소프트 링크는 본질적으로 다른 파일 또는 디렉토리에 대한 바로 가기이므로 소프트 링크를 판단 할 때 is_dir () 함수는 특히 소프트 링크가 디렉토리가 아닌 파일을 가리킬 때 어떤 유형의 컨텐츠를 가리키는 지 알 수 없습니다.

문제 배경

디렉토리가 다른 경로를 가리키는 소프트 링크 인 디렉토리 구조가 있다고 가정합니다. 이 소프트 링크를 판단하기 위해 IS_DIR ()을 사용하면 소프트 링크가 디렉토리가 아니라 일반 파일이더라도 일반적으로 true를 반환합니다. 이 문제는 특히 파일 조작 및 디렉토리가 가로 질 때 잘못된 논리적 판단으로 이어질 수 있습니다. 경로가 디렉토리인지 더 정확하게 결정하려면 IS_DIR () 로 인한 혼란을 피해야합니다.

해결책

소프트 링크 판단에서 IS_DIR () 함수의 오해의 소지가있는 특성을 해결하기 위해 다른 기능을 결합하여보다 정확한 경로 판단을 할 수 있습니다. 몇 가지 일반적인 관행은 다음과 같습니다.

1. IS_LINK ()를 사용하여 소프트 링크인지 확인

먼저 IS_LINK () 함수를 사용하여 경로가 소프트 링크인지 확인할 수 있습니다. IS_LINK () 함수는 경로가 소프트 링크인지를 나타내는 부울 값을 반환합니다. 소프트 링크인지 여부를 먼저 판단하면 잘못 판단을 피할 수 있습니다.

 <span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_link</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
    </span><span><span class="hljs-comment">// 소프트 링크라면,소프트 링크가 가리키는 대상 경로 확인</span></span><span>
    </span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readlink</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"소프트 링크 포인터:<span class="hljs-subst">$target</span></span></span><span>";
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
    </span><span><span class="hljs-comment">// 소프트 링크가 아니라면,디렉토리 여부를 결정하십시오</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 디렉토리입니다";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 不디렉토리입니다";
}
</span></span>

이런 식으로 먼저 경로가 소프트 링크인지 확인한 다음 유효한 디렉토리를 가리키는 지 여부를 결정할 수 있습니다.

2. RealPath ()를 사용하여 실제 경로를 얻으십시오

또 다른 방법은 realPath () 함수를 사용하는 것입니다.이 경로의 표준 절대 경로를 반환하여 소프트 링크로 인한 경로 해상도 문제를 해결하는 것입니다. realpath () 로 경로를 전달함으로써 대상 경로의 최종 실제 위치를 얻을 수 있으므로 IS_DIR ()를 직접 사용할 때 소프트 링크에 ​​의해 오해되는 것을 피할 수 있습니다.

 <span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;
</span><span><span class="hljs-variable">$realPath</span></span><span> = </span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$realPath</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span> &amp;&amp; </span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$realPath</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$realPath</span></span></span><span> 유효한 디렉토리입니다";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 不유효한 디렉토리입니다";
}
</span></span>

이 예에서 realPath ()는 소프트 링크를 구문 분석하고 가리키는 실제 경로를 반환합니다. 다음으로 IS_DIR ()를 안전하게 사용하여 소프트 링크에 ​​의해 잘못 인도되지 않고 디렉토리인지 확인할 수 있습니다.

3. lstat () 함수를 사용하십시오

lstat ()stat () 와 유사한 함수이지만 소프트 링크를 따르지 않습니다. 링크가 지적한 대상 정보가 아니라 소프트 링크 자체의 상태 정보를 반환합니다. 소프트 링크의 경우 링크 자체의 상태를 얻으려면 lstat ()를 사용하여 판단 할 수 있습니다.

 <span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">lstat</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)[</span><span><span class="hljs-string">'mode'</span></span><span>] &amp; </span><span><span class="hljs-number">0170000</span></span><span> === </span><span><span class="hljs-number">0040000</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 디렉토리입니다(부드러운 링크이더라도)";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 不디렉토리입니다";
}
</span></span>

lstat () 함수를 사용하면 소프트 링크의 판단을보다 정확하게 제어하고 링크에 대한 자세한 정보를 얻을 수 있습니다.

요약

PHP에서는 is_dir () 함수가 경로가 디렉토리인지 여부를 알 수 있지만 소프트 링크의 경우 부정확 한 결과를 제공 할 수 있습니다. 이 오해의 소지가 피하기 위해 is_link () , realpath ()lstat () 와 같은 함수를 사용하여 다양한 방식으로 경로를 효과적으로 확인할 수 있습니다. 이를 통해 파일 시스템을보다 정확하게 작동시켜 소프트 링크로 인한 잠재적 인 문제를 피할 수 있습니다.