根据文件夹中已存在的内容创建名称文件

时间:2010-01-16 11:25:02

标签: php

我想在文件夹中创建一个新文件,其中现有文件的名称按数字顺序排列,例如。 1,2,3,4 ......

我想查看最后一个nr是什么,然后创建一个nr超过该文件的文件。

我知道我应该使用file_exists但我不确切知道如何使用它,在for循环可能吗?但是如何?

如果有人能给我一个提示,

会很好。

3 个答案:

答案 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)

单程。想象文件名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