Hello,
Il y a peu j'ai une grande quantité d'images (~10'000) qui ont perdu leur date de modification. Conséquence, c'est un enfer de les trier manuellement, mais heureusement elles possèdent la date dans leur nom (sous forme IMG-YYYYMMDD).
J'ai donc voulu utiliser la fonction touch ( https://www.php.net/manual/fr/function.touch.php ) qui semble avoir des soucis sur Windows. Cependant je suis en version de PHP 7, donc ça devrait fonctionner.
Voilà mon bout de code (dégueulasse hein, mais détails )
<?php
/* This script is used to edit datetime of files */
/* You need a subfolder called "folder" to put your files into */
$files = scandir('folder');
$i = count($files);
$e = 0;
foreach($files as $file) {
if (preg_match("/IMG\-[0-9]{8}\-.*/", $file)) {
$date = explode("-", $file)[1];
$val = strtotime($date);
echo $val . " ( " . $date . " )<br>";
echo touch( __DIR__ . '/' . $file, $val, $val) ? "ok <br>" : "ko <br>";
var_dump( stat($file)) . "<br>";
}
else {
$e++;
}
}
echo "Il y a $i fichiers, dont $e n'ont pas été modifiés";
Pourtant quand je regarde mon var_dump, il m'indique que ctime et atime sont modifiés, mais rien ne s'affiche sur mon Windows.
var_dump : https://puu.sh/DiSeD/5c7d68c7a1.png (avec en haut le comparatif timestamp / date)
Display Windows : https://puu.sh/DiSiI/98fdd73580.png
A partir de là, est-ce qu'il y a des alternatives à cette fonction touch ? Ou bien il faut que j'aille installer un Ubuntu en machine virtuelle pour le plaisir de lancer un script de 10 lignes ?
ton code il tourne dans un serveur apache ou un truc du genre, ou tu t'en sert en ligne de commande?
(Je demande parcequ'il y a des gens qui disent: PHP won't touch if it is not the current owner of the file, even if the directory and files are writeable by the PHP user.)
Le 23 avril 2019 à 22:31:26 GrandeGuerre a écrit :
Hello,Il y a peu j'ai une grande quantité d'images (~10'000) qui ont perdu leur date de modification. Conséquence, c'est un enfer de les trier manuellement, mais heureusement elles possèdent la date dans leur nom (sous forme IMG-YYYYMMDD).
J'ai donc voulu utiliser la fonction touch ( https://www.php.net/manual/fr/function.touch.php ) qui semble avoir des soucis sur Windows. Cependant je suis en version de PHP 7, donc ça devrait fonctionner.
Voilà mon bout de code (dégueulasse hein, mais détails )
<?php /* This script is used to edit datetime of files */ /* You need a subfolder called "folder" to put your files into */ $files = scandir('folder'); $i = count($files); $e = 0; foreach($files as $file) { if (preg_match("/IMG\-[0-9]{8}\-.*/", $file)) { $date = explode("-", $file)[1]; $val = strtotime($date); echo $val . " ( " . $date . " )<br>"; echo touch( __DIR__ . '/' . $file, $val, $val) ? "ok <br>" : "ko <br>"; var_dump( stat($file)) . "<br>"; } else { $e++; } } echo "Il y a $i fichiers, dont $e n'ont pas été modifiés";
Pourtant quand je regarde mon var_dump, il m'indique que ctime et atime sont modifiés, mais rien ne s'affiche sur mon Windows.
var_dump : https://puu.sh/DiSeD/5c7d68c7a1.png (avec en haut le comparatif timestamp / date)
Display Windows : https://puu.sh/DiSiI/98fdd73580.pngA partir de là, est-ce qu'il y a des alternatives à cette fonction touch ? Ou bien il faut que j'aille installer un Ubuntu en machine virtuelle pour le plaisir de lancer un script de 10 lignes ?
Windows c'est de la merde .... et tu peux surement faire ça en shell
a mon avis modifie plutôt dans le mime windows est sensé récupérer la date de prise de vue. Sinon ta des outils de gestion de media qui existe...
et windows fais le taf ..
Hello, et merci pour vos deux réponses !
Je lance ça sur un serveur Apache en localhost, et le problème ne vient pas de Windows mais d'un bon vieux PEBCAK des familles.
C'est à présent corrigé, mais mon code je faisais ça :
$files = scandir('folder');
[...]
echo touch( __DIR__ . '/' . $file, $val, $val) ? "ok <br>" : "ko <br>";
Donc forcément si je fais un scandir d'un sous-dossier et que je touch pas dans le sous-dossier, ça marche pas.
Quoiqu'il en soit ça fonctionne très bien, l'étape suivant c'est que le périphérique cible arrête de modifier les valeurs de modification à la date de copie du fichier.