delete (unlink) fivhier qui ne sont pas dans une liste

Eléphant du PHP | 75 Messages

14 janv. 2011, 18:51

Bonjour

j'ai des noms de fichier dans une base de données SELECT files from products
j'ai des fichiers dans un dossier products_files

Je voudrais supprimer tous les fichiers du dossier products_files qui ne sont pas dans ma table products

comment faire ? ...avec un petit exemple de code

merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 janv. 2011, 19:36

salut,

pas d'exemple de code mais l'idée

Tu sélectionne les noms de fichiers dans la table.
Tu récupère le nom de tous les fichiers du répertoire dans un tableau (aller je t'aide => glob)
lors du traitement de la requête tu vide le tableau des fichiers a partir des résultats du select
tu parcourt ce qui reste du tableau pour faire un unlink sur tous (bon attention au . et .. je sais plus si c'est retourné, et aussi au fait qu'il ne s'agisse pas de répertoire :))



@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 75 Messages

14 janv. 2011, 19:49

euh .. bon je vais voir :-( merci

Petit nouveau ! | 3 Messages

14 janv. 2011, 19:52

Tu pourrais aussi créer un nouveau dossier puis copier dedans tous les fichiers qui correspondent aux entrées de ta table.
Ensuite tu supprime l'ancien dossier.

Eléphant du PHP | 75 Messages

14 janv. 2011, 21:04

avec 3 ou 4000 fichiers c'est impossible

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 janv. 2011, 21:15

bof avec 2 aussi c'est un peu inutile, par contre pour un aussi grand nombre il y a des change que cela prenne plus de 30s qui est le temps limite d’exécution d'un script php (par défaut).


@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 5462 Messages

14 janv. 2011, 21:21

bof avec 2 aussi c'est un peu inutile, par contre pour un aussi grand nombre il y a des change que cela prenne plus de 30s qui est le temps limite d’exécution d'un script php (par défaut).


@+
le glob est assez rapide, ca passe largement :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 janv. 2011, 22:11

ha, c'est plus le unlink qui "chagrine", mais ça dépend de la taille de fichier nan ?
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 5462 Messages

14 janv. 2011, 22:25

ha, c'est plus le unlink qui "chagrine", mais ça dépend de la taille de fichier nan ?
oui c'est vrai que celui la pourrait posé probleme

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 janv. 2011, 22:58

Bonjour,

Tu peux mettre les noms des fichiers, qui se trouvent dans le disque, dans un tableau 1 et les noms des fichiers, qui se trouvent dans la base, dans un tableau 2 puis utiliser la fonction array_diff() pour déterminer la différence entre ces 2 tableaux.
Le tableau 3 résultat de cette différence contiendra forcément les noms des fichiers qui doivent être supprimés.

Extrait de la doc sur la fonction array_diff:
Exemple #1 Exemple avec array_diff()
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);
?>

Les valeurs multiples dans array1 seront toutes traitées de la même façon. Ce qui affichera :

Array
(
[1] => blue
)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 75 Messages

15 janv. 2011, 08:02

Tu peux mettre les noms des fichiers, qui se trouvent dans le disque, dans un tableau 1 et les noms des fichiers, qui se trouvent dans la base, dans un tableau 2 puis utiliser la fonction array_diff() pour déterminer la différence entre ces 2 tableaux.
Le tableau 3 résultat de cette différence contiendra forcément les noms des fichiers qui doivent être supprimés.
Je vais essayer ça
merci

Eléphant du PHP | 75 Messages

15 janv. 2011, 11:03

ça marche très bien et très rapide sur des milliers d'images

merci