我想在文件夹中创建一个新文件,其中现有文件的名称按数字顺序排列,例如。 1,2,3,4 ......
我想查看最后一个nr是什么,然后创建一个nr超过该文件的文件。
我知道我应该使用file_exists但我不确切知道如何使用它,在for循环可能吗?但是如何?
如果有人能给我一个提示,会很好。
答案 0 :(得分:5)
我认为这是您最好的选择(请参阅先前版本的revisions ):
$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
只要文件夹中的文件名以数字开头,就应该始终写出编号最高的文件名,加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
你可以通过将glob的模式更改为/path/[0-9]*
来解决这个问题,然后只能匹配以数字开头的文件。那应该是非常可靠的。
注意 natsort
在不同的操作系统上表现不同。以上工作在我的Windows机器上运行正常,但您需要检查生成的排序顺序,以使其适用于您的特定计算机。
有关如何使用glob()
,natsort()
和pathinfo()
的详细信息,请参阅手册;
答案 1 :(得分: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
答案 2 :(得分:1)
$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