create file with name based on what already exist in folder
i want to create a new file in a folder with existing files with names in a numerical order eg. 1, 2, 3, 4...
i want to check what is the last nr and then create a file with one nr over that one.
i know i should use file_exists but i don't know exactly how to use it, in a for loop maybe? but how?
would be nice if s开发者_高级运维omeone could give me a hint
I think this is your best bet (see revisions for previous versions):
$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
As long as your filenames in the folder start with numbers, this should always write the highest numbered filename incremented by one, e.g.
1,5,10 => writes file 11
1.txt, 5.gif, 10.jpg => writes file 11
1, 5.txt, 10_apple.txt => writes file 11
If there is a file not starting with a number, the above approach won't work, because numbers are sorted before characters and thus nothing would be written for e.g.
1,5,10,foo => foo+1 equals 1, already exists, nothing written
You can get around this by changing the pattern for glob to /path/[0-9]*
, which would then only match files starting with a number. That should be pretty solid then.
Note natsort
behaves different on different OS. The above works fine on my Windows machine, but you will want to check the resulting sort order to get it working for your specific machine.
See the manual for further info on how to use glob()
, natsort()
and pathinfo()
;
Maybe like this?
$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
one way. imagine filenames 1.txt, 2.txt etc
$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);
output
$ 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
精彩评论