CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[PHP] Alternative à la function touch ?

GrandeGuerre
GrandeGuerre
Niveau 11
23 avril 2019 à 22:31:26

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 :noel: )

<?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. :pf:
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 ? :hap:

godrik
godrik
Niveau 30
24 avril 2019 à 01:27:49

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.)

20_cent_2017
20_cent_2017
Niveau 10
24 avril 2019 à 13:32:02

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 :noel: )

<?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. :pf:
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 ? :hap:

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 ..

GrandeGuerre
GrandeGuerre
Niveau 11
25 avril 2019 à 12:00:20

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. :noel:
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. :hap:

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. :siffle:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment