2010-01-16 3 views
2

Je veux créer un nouveau fichier dans un dossier avec des fichiers existants avec des noms dans un ordre numérique, par exemple. 1, 2, 3, 4 ...créer un fichier avec le nom basé sur ce qui existe déjà dans le dossier

Je veux vérifier quel est le dernier nr et ensuite créer un fichier avec un nr sur celui-ci.

Je sais que je devrais utiliser file_exists mais je ne sais pas exactement comment l'utiliser, dans une boucle for peut-être? mais comment?

serait bien si quelqu'un pouvait me donner un indice

Répondre

5

Je pense que c'est votre meilleur pari (voir revisions pour les versions précédentes):

$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  

Tant que vos noms de fichiers dans le dossier commencer par les nombres, cela devrait toujours écrire le nom de fichier le plus élevé incrémenté par un, par exemple

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

S'il y a un fichier pas en commençant par un numéro, l'approche ci-dessus ne fonctionnera pas, parce que les numéros sont classés avant les caractères et donc rien ne serait écrit par exemple

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

Vous pouvez contourner ce problème en changeant le modèle pour glob à /path/[0-9]*, qui serait alors correspondre uniquement les fichiers commençant par un numéro. Cela devrait être assez solide alors.

Remarquenatsort se comporte différemment selon les systèmes d'exploitation. Ce qui précède fonctionne très bien sur mon ordinateur Windows, mais vous voudrez vérifier l'ordre de tri qui en résulte pour le faire fonctionner pour votre machine spécifique.

Voir le manuel pour plus d'informations sur l'utilisation de glob(), natsort() et pathinfo();

+0

si 1.jpg et 2.gif habitude importance ou ne sont u en supposant qu'ils ont même extension? – ajsie

+1

L'astérisque dans glob correspond à tous les fichiers du dossier, indépendamment de l'extension. – Gordon

+0

Si vous avez supprimé un fichier (qui était obsolète ou quelque chose), alors cela échoue, car le nombre de fichiers est différent de la dernière 'numéro d'identification' – Veger

2

Peut-être que cela?

$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

Propre et agréable, mais il convient de noter qu'il écrira le premier fichier qui ne figure pas dans le répertoire, par ex. quand il y a 10 fichiers et je supprime 1.txt, le code ci-dessus va créer 1.txt sur la prochaine exécution, au lieu de 11.txt – Gordon

1

d'une manière. imaginez 1.txt les noms de fichiers, etc 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); 

sortie

$ 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

Le pire morceau de code que j'ai vu toute la journée, ** 1) ** 'glob() 'doit savoir' $ dir', ** 2) ** vous devez utiliser {0,1,2,3,4,5,6,7,8,9} et le drapeau GLOB_BRACE et même celui qui a été gagné 't correspond '' 10.txt' par exemple et ** 3) ** 'glob()' trie déjà les choses, pourquoi les trier à nouveau? –

+0

Vous devriez aller essayer de globbing et voir. créer des fichiers 1.txt à 20.txt. Ensuite, faites le glob normal, puis utilisez sort() par numeric + globbing. Vous verrez la différence. – ghostdog74

+0

Essayez d'exécuter ceci avec un chemin différent du répertoire actuel. Sur ma machine Windows, le tri a l'air différent. Ce sera descendant et pas dans le bon ordre, probablement parce que j'ai aussi les fichiers 123_foo.txt dans le répertoire. – Gordon

Questions connexes