Pb chemin de longueur superieure à 255 caractères [Résolu]

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
- 8 nov. 2005 à 21:38 - Dernière réponse :
Messages postés
46
Date d'inscription
lundi 24 janvier 2005
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
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
- 11 nov. 2005 à 11:38
3
Merci
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().



Merci kohntark 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de kohntark
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
- 8 nov. 2005 à 22:57
1
Merci
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-
Commenter la réponse de kohntark
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Dernière intervention
13 avril 2007
- 8 nov. 2005 à 22:37
0
Merci
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>
Commenter la réponse de cs_Anthomicro
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
- 8 nov. 2005 à 22:51
0
Merci
Tu peux changer d'OS quoi :/
Commenter la réponse de FhX
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Dernière intervention
13 avril 2007
- 8 nov. 2005 à 23:00
0
Merci
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>
Commenter la réponse de cs_Anthomicro
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
- 8 nov. 2005 à 23:51
0
Merci
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
Commenter la réponse de FhX
Messages postés
46
Date d'inscription
lundi 24 janvier 2005
Dernière intervention
11 novembre 2005
- 9 nov. 2005 à 10:35
0
Merci
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.
Commenter la réponse de psychosic
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
- 9 nov. 2005 à 17:32
0
Merci
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 :-\
Commenter la réponse de kohntark
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
- 9 nov. 2005 à 20:45
0
Merci
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 :)
Commenter la réponse de FhX
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
- 10 nov. 2005 à 06:45
0
Merci
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-
Commenter la réponse de kohntark
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
- 10 nov. 2005 à 14:00
0
Merci
" Cette limitation est liée, amha, au système de fichier des machines 32 bits."
Exact, jme suis mélangé quelque part.
Commenter la réponse de FhX
Messages postés
46
Date d'inscription
lundi 24 janvier 2005
Dernière intervention
11 novembre 2005
- 11 nov. 2005 à 00:37
0
Merci
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.
Commenter la réponse de psychosic
Messages postés
46
Date d'inscription
lundi 24 janvier 2005
Dernière intervention
11 novembre 2005
- 12 nov. 2005 à 16:47
0
Merci
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 ;)
Commenter la réponse de psychosic

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.