Pb chemin de longueur superieure à 255 caractères

Résolu
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 8 nov. 2005 à 21:38
psychosic Messages postés 46 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 11 novembre 2005 - 12 nov. 2005 à 16:47
Salut,



Je souhaite lister un répertoire (ou une unité) afin d'appliquer un
traitement à certains types de fichiers. Le script s'execute en CLI
sous windows.



Voici la fonction :

(origine : [code.aspx?id= 31179 http://www.phpcs.com/code.aspx?id=31179] épurée)



<?php

function recursive_readdir ($dir) {

$dir = rtrim ($dir, '/');

if (is_dir ($dir)) {

$dh = opendir ($dir);

} else {

echo "\nRep invalide : ".$dir;

exit;

}

while (($file = readdir ($dh)) !== false ) { // parcours du rep

if ($file !== "." && $file !== '..') {

$path =$dir."/".$file;

echo
"rep en cours : \n".$path."\nlongueur = ".strlen($dir)." car\n";

echo $path;

if (is_dir ($path)) { // cas sous-rep

recursive_readdir ($path); // appel recursif

} else {


echo $file."\n";


}

}

}

closedir ($dh);

echo "\nTermine\n";

}

?>

Exemple : J'execute "recursive_readdir ('C:');" depuis l'unité D:

C:\ contient des chemins du type C:\[chemin + nom de fichier + ext = 256 caracteres]



Dans ces conditions le script plante puisque la fonction prends le
chemin absolu, ce qui fait plus de 256 caractères (259 en l'occurence)



Comment puis je faire pour lister sans bug l'intégralité du chemin passé en paramètre ?

J'ai bien tenté des trucs avec chdir mais ca devient vite une usine à gaz.

Les fonctions récursives de PHPCS donnent le même résultat et je n'ai rien trouvé sur le web.



Merci d'avance,



Kohntark-



=31179

13 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
11 nov. 2005 à 11:38
Salut psychosic,



J'ai fait quelques tests et je ne vois pas bien où tu veux en venir.

Un moment je suis bien obligé de faire un "opendir([chemin complet non encodé])"

(opendir(base64_decode($path_enc); ??) et cela ne changera donc rien.

Peux tu préciser stp, peut être t'ai je mal compris ?



Sinon j'ai "pondu" un truc qui nécessite quelques retouches et tests supplémentaires mais qui fonctionne correctement.

Faute de temps je poste la source complète et non le simple listage de fichiers.



Il s'agit en fait de corriger en masse un "bug" excel :

Lors de l'ouverture d'un fichier .csv dont les premiers caractères
commencent par "ID", excel affiche le message "Format de fichier SYLK:
non valide" et n'ouvre pas le fichier (http://support.microsoft.com/kb/q215591/)

La solution, toute simple, consiste a ajouter un apostrophe au début du fichier.



En résumé j'utilise la fonction recursive_readdir
() normalement et effectue les corrections avec correction(). Par
contre, dès que le chemin atteind 255 caractères (avec la lettre
d'unité), je bascule en chemin relatif grâce à sup_max().



3
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
8 nov. 2005 à 22:57
seriez vous en train de suggérer que
windows c'est de la m.... ? Je suis justement en train de découvrir
Mandrake ... mais pour le présent pb je n'ai pas le choix, c'est
windows.



Kohntark-
1
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
8 nov. 2005 à 22:37
Salut,



à part utiliser un chemin relatif, je ne vois pas :-(

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 nov. 2005 à 22:51
Tu peux changer d'OS quoi :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
8 nov. 2005 à 23:00
FhX > MDR

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 nov. 2005 à 23:51
Non mais je rigole ! Meme sous Linux y'a la barrières de 255 caractères :)
Non si plus serieusement, tu peux passer sous 1012 caractères avec EXT2fs (qui n'est supporté que par Nux :) )

Mais alors comment, ca je sais plus :o
0
psychosic Messages postés 46 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 11 novembre 2005
9 nov. 2005 à 10:35
essaye de mettre ton fichier de listage de rep au plus profond de tes rep.



Comme ca tu prend déja le pb a l'inverse et peut etre que ca va tourner.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
9 nov. 2005 à 17:32
Impossible, il faut que je puisse exécuter le script à partir d'une clé USB et analyser un autre volume du disque.

Je suis en train de bricoler un truc qui passe en chemin relatif dès
que nécessaire. Ce n'est pas très beau mais pour le moment ça
fonctionne.

... tout de même étrange cette limitation :-\
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
9 nov. 2005 à 20:45
Bah... un caractère = 1 octet.
255 caractères = 255 octets.

Jcrois que c'est dû à la taille du bus (256 bits), mais alors j'en suis pas du tout sur (et pourtant, j'ai fais ca en électronique...)

Ah voila, j'ai trouvé !

"nommage UTFx ou x est le nombre de bits
UTF8 -> 255 caractères -> compatible avec la plupart
des programmes utilisant l'ASCII.
futur: UTF16 ou UTF24-> 2^16 et 2^24 caractères ->
tous les alphabets du monde sont supportés
défaut: UTF16 double la taille des fichiers,
UTF24 la double !"

C'est le système Unicode qui veut ca :)
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
10 nov. 2005 à 06:45
Salut FhX,



Unicode, Ascii etc .. détermine l'encodage des caractères me semble t
il ? A savoir le nombre de "symboles" pouvant être représentés
(a,b,c,...1, 2,?/§ ...)

Par exemple la lettre "é" ne peut pas être représentée en Ascii
pur (128 caractères : A-Z, a-z,1-9, caractères de contrôles, de
ponctuation et de calcul) mais cela ne définie pas la limite du nombre
de caractères pour un nom de fichier.

Cette limitation est liée, amha, au système de fichier des machines 32 bits.



Kohntark-
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
10 nov. 2005 à 14:00
" Cette limitation est liée, amha, au système de fichier des machines 32 bits."
Exact, jme suis mélangé quelque part.
0
psychosic Messages postés 46 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 11 novembre 2005
11 nov. 2005 à 00:37
essaye de mettre tout ton paramètres chemin de base 64 avec les
fonctions base64_encode comme ca ton chemin fera toujours 64 caractères.
0
psychosic Messages postés 46 Date d'inscription lundi 24 janvier 2005 Statut Membre Dernière intervention 11 novembre 2005
12 nov. 2005 à 16:47
pas mal ton truc, je croyais que tu était limité dans ton paramètre d'url désolé.



Sinon ta source a l'air bien. Mets la en ligne comme ca on la garde bien au chaud ;)
0
Rejoignez-nous