2010-12-29 5 views
3

공백과 같은 파일 이름 (예 : ,, (, ), ! 등)이있는 이전 파일을 PHP를 통해 삭제해야합니다. Classic unlink($filename)은이 파일들에 대해 작동하지 않습니다. 파일 이름을 언 링크 기능과 파일 시스템을 허용하는 파일 이름으로 변환하려면 어떻게해야합니까? Solaris 시스템에서 실행 중이며 다른 시스템에 액세스 할 수 없습니다.파일 이름에 특수 문자가있는 파일 삭제

답변

2

$filename을 어떻게 구성하고 있습니까? unlink는 일반 문자를 이스케이프 처리 할 때 특수 문자가있는 파일 이름에서 작동해야합니다. 예 : this has, various/wonky !characters in it의 이름을 가진 파일의

$filename = 'this has\, various\/wonky \!characters in it'; 
unlink($filename); 

작동합니다.

+0

파일 이름이 readdir 명령에서 출력됩니다. 디렉토리의 파일이 id 데이터베이스에 사용되는지 비교합니다. 그렇지 않으면 삭제하십시오. 이 파일 이름을 벗어날 수는 없지만 자동으로 이스 페이스하는 방법이 있습니까? 나는 "ž ľ č š"와 같은 cp-1250 문자가있을 수 있다고 덧붙여 야합니다 ... – gadelat

+1

쉘 메타 문자가 포함 된 파일 이름을 다루는 경우에는 그 파일을 벗어나야합니다. Unlink는 파일 이름의'/'가 실제로 파일 이름의 일부이며 디렉토리 분리 기호가 아니라는 것을 알지 못할 것입니다. –

+0

cp-1250 문자는 문제가되지 않아야합니다. PHP 및/또는 glibc가 다른 코드 페이지/문자 세트에서 작동하는 경우가 아니면. "외국"문자 세트의 악센트 부호가있는 문자 중 하나가 우연히'/'와 같은 쉘 메타 문자 중 하나에 매핑 될 수 있지만 그 다음에 사각형으로 돌아갈 가능성이 있습니다 (그렇지만은 않을 것입니다). –

0

Linux에서 나는 "rm ./filename"과 같은 절대 경로를 사용하는 것이 점 슬래시입니다.

이스케이프 문자를 사용할 수도 있습니다. "rm \ -filename"은 - 백스 캐쉬 하이픈과 같습니다.

1

unlink는 유효한 문자열을 허용하며 해당 문자열의 파일을 삭제하려고 시도합니다.

unlink('/home/user1/"hello(!,'); 

아마도 특정 문자를 올바르게 이스케이프 처리하지 못하고 있습니다.

1

당신은 모든 필요한 파일을 찾아 RegexIterator 사용하여 연결을 해제 할 수 있습니다 : ('.')이 코드는 재귀 적으로 현재에서 모든 디렉토리를 통과

<?php 

$dir = new RecursiveDirectoryIterator('.'); 
$iterator = new RecursiveIteratorIterator($dir); 
$regex = new RegexIterator($iterator, '/(^.*[\s\.\,\(\)\!]+.*)/', RecursiveRegexIterator::GET_MATCH); 

foreach ($regex as $file) { 
     if (is_file($file[0])) { 
       print "Unlink file {$file[0]}\n"; 
       unlink($file[0]); 
     } 
} 

및/(^ '정규식에 의해 모든 파일과 일치합니다. [\ s \ ,.()!] +.)/'를 입력 한 다음 삭제하십시오.

관련 문제