2010-01-16 5 views
2

예를 들어 숫자가있는 순서로 이름이있는 기존 파일이있는 폴더에 새 파일을 만들고 싶습니다. 1, 2, 3, 4 ...폴더에 이미 존재하는 것을 기반으로 이름을 가진 파일을 만듭니다.

나는 마지막 nr이 무엇인지 확인한 다음 그 위에 하나의 nr이있는 파일을 만들고 싶습니다.

나는 file_exists를 사용해야하지만 정확히 for 루프를 사용하는 방법을 모른다. 하지만 어떻게? 폴더에 파일 이름만큼

$files = glob('/path/to/dir/*');  // get all files in folder 
natsort($files);       // sort 
$lastFile = pathinfo(array_pop($files)); // split $lastFile into parts 
$newFile = $lastFile['filename'] +1; // increase filename by 1 

if(file_exists("/path/to/dir/$newFile")) { // do not write file if it exists 
    die("$newFile aready exists"); 
} 
file_put_contents("/path/to/dir/$newFile", 'stuff'); // write new file  

: 누군가가 나는 이것이 가장 좋은 생각의 힌트 나에게

답변

5

을 줄 수 있다면

좋을 텐데 ( 이전 버전에 대한 revisions 참조) 숫자로 시작합니다.이 경우 항상 가장 높은 번호의 파일 이름을 1 씩 증가시켜야합니다. 숫자로 시작하는 파일 하지이 경우 숫자 문자 전에 분류되어있어 아무 것도 예에 대한 기록되지 않기 때문에

1,5,10     => writes file 11 
1.txt, 5.gif, 10.jpg => writes file 11 
1, 5.txt, 10_apple.txt => writes file 11 

은, 위의 방법은 작동하지 않습니다

1,5,10,foo => foo+1 equals 1, already exists, nothing written 

당신 만 숫자로 시작하는 파일과 일치 것이다, /path/[0-9]*에 글로브의 패턴을 변경하면이 문제를 해결할 수 있습니다. 그 때 꽤 단단해야합니다.

natsort는 다른 OS에 다른 동작합니다. 위의 내용은 Windows 컴퓨터에서 제대로 작동하지만 결과 정렬 순서를 확인하여 특정 컴퓨터에서 작동하도록 할 수 있습니다.

glob(), natsort()pathinfo()을 사용하는 방법에 대한 자세한 내용은 설명서를 참조하십시오.

+0

그래서 1.JPG 및 2.gif 늘 문제 또는 u들이 같은 확장자를 가지고 가정입니까? – ajsie

+1

glob에있는 별표는 확장자에 관계없이 폴더의 모든 파일과 일치합니다. – Gordon

+0

파일을 삭제하면 (오래된 파일이거나 무언가 였음) 파일 수가 최신 'id-number'와 같지 않으므로 실패합니다. – Veger

2

어쩌면 이렇게 할 수 있을까요?

$name = 'filename'; 
$ext = '.txt'; 
$i = 1; 
$tmpname = $name . $ext; 
while(file_exists($tmpname)) { 
    $i++; 
    $tmpname = $name . $i . $ext; 
} 

// $tmpname will be a unique filename by now 
+0

깨끗하고 멋지지만 디렉토리에없는 첫 번째 파일을 작성한다는 점에 유의해야합니다. 10 파일이 있고 1.txt를 삭제하면 위의 코드는 11.txt 대신 다음 실행시 1.txt를 만듭니다. – Gordon

1

편도. 파일 이름 1.TXT 상상, 2.txt 등

$dir = "/path"; 
chdir($dir); 
$files = glob("[0-9]*.txt"); 
print "Files aftering globbing: "; 
print_r($files); 
sort($files,SORT_NUMERIC); 
print "After sorting using numeric sort: "; 
print_r($files); 
# get latest file 
$newest=end($files); 
$s=explode(".",$newest); 
$s[0]=$s[0]+1; 
$newname=$s[0].".txt"; 
touch($newname); 

출력

$ ls *txt 
10.txt 11.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 

$ php test.php 
Files aftering globbing: Array 
(
    [0] => 1.txt 
    [1] => 10.txt 
    [2] => 11.txt 
    [3] => 2.txt 
    [4] => 3.txt 
    [5] => 4.txt 
    [6] => 5.txt 
    [7] => 6.txt 
    [8] => 7.txt 
    [9] => 8.txt 
    [10] => 9.txt 
) 
After sorting using numeric sort: Array 
(
    [0] => 1.txt 
    [1] => 2.txt 
    [2] => 3.txt 
    [3] => 4.txt 
    [4] => 5.txt 
    [5] => 6.txt 
    [6] => 7.txt 
    [7] => 8.txt 
    [8] => 9.txt 
    [9] => 10.txt 
    [10] => 11.txt 
) 

$ ls *.txt 
10.txt 11.txt **12.txt** 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 
+1

하루 종일 보아온 코드 중 최악의 코드 ** **) ** glob()''$ dir'을 알아야합니다. ** ** 2) ** {0,1,2,3,4,5,6,7,8,9}와 GLOB_BRACE 플래그를 사용해야합니다. 예를 들어 10.txt'와 일치하고 ** 3) ** glob()은 이미 항목을 정렬합니다. 왜 다시 정렬합니까? –

+0

당신은 globbing 시도하고 참조하십시오. 1.txt ~ 20.txt 파일을 만듭니다. 그런 다음 일반 glob을 수행 한 다음 sort +를 glob + globbing으로 사용합니다. 당신은 차이를 볼 수 있습니다. – ghostdog74

+0

이것을 현재 디렉토리와 다른 경로로 실행하십시오. 내 Windows 컴퓨터에서는 종류가 다르게 보입니다. 디렉토리에 123_foo.txt 파일이 있기 때문에 내림차순으로 정렬되지 않을 것입니다. – Gordon

관련 문제