[Résolu][Calc]Récupérer des noms de fichiers >256 Caractères

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

[Résolu][Calc]Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

Tout d'abord merci à alhazred qui non seulement m'a aidé sur le problème de catalogue de dossier, mais m'a ouvert à la programmation.

Ma difficulté actuelle, dans une arborescence de répertoires très importante, est de lister des fichiers dont certains (notamment des .eml dont le nom est l'objet du mail) ont une longueur de plus de 256 caractères. Je pensais naîvement que le seul fait de passer en notation URL me permettait de contourner cette difficulté propre à Windows, mais hélas il n'en est rien, le fileaccess me renvoie rien lorsque'il passe sur un fichier dont la longueur du nom complet dépasse la limite

Quelqu'un a peut être contourné cette difficulté ?

Merci d'avance
Dernière modification par micmac le 04 avr. 2015 09:23, modifié 1 fois.
Raison : [Résolu] et la coche dans le titre du premier message.Merci
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
cypher.sephiroth
Membre OOrganisé
Membre OOrganisé
Messages : 90
Inscription : 09 janv. 2012 17:10
Localisation : 31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par cypher.sephiroth »

Bonjour JeanNoduRhone,
Les chemins ressemblent à "C:\Dossier1\Dossier2\...\NomQuiFaitPlusDe256Caractères.eml" ou "C:\Dossier1\Dossier2\...\DossierX\ObjetMail.eml" dont la longueur fait plus de 256 caractères ?
J'utilise LibreOffice 4.3.6.2 sur Windows 7 64 bits pro
--
Et parfois, ça fait "Coin !"...
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

Bonjour,

Nous sommes en environnement pur windows, et si les objets des mails font plus de 256 caractères, ils sont tronqués à l'enregistrement sur le disque. C'est donc le nom complet qui dépasse les 256 caractères.

L'outil que je réalise permet à un utilisateur de lister ce que contient ses répertoires, filtrer sur les dates pour supprimer les fichiers ou les recopier dans un répertoire d'archive (avec la structure de répertoire d'origine). La difficulté suivante sera dans la même logique : est ce que les instructions Kill et FileCopy sont capable de traiter des fichiers dont le nom complet est de plus de 256 car.

En tout cas merci d'avance pour ton aide
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
cypher.sephiroth
Membre OOrganisé
Membre OOrganisé
Messages : 90
Inscription : 09 janv. 2012 17:10
Localisation : 31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par cypher.sephiroth »

D'après l'aide :
Instruction Kill [Exécution]
Supprime un fichier d'un disque.
Syntaxe :
Kill File As String
Paramètres :
File : expression au format chaîne de caractères contenant une spécification de fichier non ambiguë. Vous pouvez également utiliser la notation URL.
Codes d'erreur
5 appel de procédure incorrect
76 chemin non trouvé
Exemple :
Sub ExampleKill
Kill "C:\datafile.dat" ' Le fichier doit être créé à l'avance
End Sub
Donc Kill demande une chaîne de caractères, ce dont tu te doutais. Pareillement pour FileCopy.
En consultant "The Bible" :
Les chaînes de caractères [...] contiennent une série de 0 à 65 535 caractères.
C'est donc curieux que cela ne fonctionne pas. Peux-tu envoyer ce que tu as déjà réalisé ?
J'utilise LibreOffice 4.3.6.2 sur Windows 7 64 bits pro
--
Et parfois, ça fait "Coin !"...
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

ci joint le fichier complet.
Il possède 3 série de boutons :
- lister les fichiers d'un répertoire avec un lien pour accéder aux fichiers ou effacer la liste,
- repérer les fichiers candidats à la suppression/archivage en fonction de la date ou lancer l'archivage et la suppression
- préparer pour les fichiers restant, la copie vers un nouveau plan de classement ou lancer cette copie.

En fait, tout fonctionne parfaitement sauf lorsque j'ai un nom complet supérieur à 256 caractères, car c'est à partir de la feuille qui liste les fichiers que j'archive (ou que j'envoie dans un nouveau plan de classement--> d'où la bibliothèque pour gérer le menu du clic droit dans les colonnes F à I) en fonction du choix de l'utilisateur.
Si le nom complet (répertoire + fichier) fait plus de 256 caractères, il n'est pas dans la liste (et le reste du répertoire n'est pas affiché) ... et je ne peux pas savoir si je peux le copier, le supprimer ou non.

Au passage, les petits modules W_xx sont générés dynamiquement à partir de la feuille paramètre (qui contient le nouveau plan de classement).
Merci de ton aide
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26215
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par Dude »

Salut,
JeanNoduRhone a écrit :tout fonctionne parfaitement sauf lorsque j'ai un nom complet supérieur à 256 caractères
Calc s'appuie sur le système d'exploitation qui l'héberge.
Fais déjà l'essai dans l'explorateur Windows.
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

Bonjour Dude,

Le problème des noms longs mais limités à 256 caractères est un problème récurrent sous Windows . L'éditeur indique que c'est pour conserver la compatibilité avec Windows 95.

Sous l'explorateur Windows il est possible d'explorer toute l'arborescence jusqu'au fichier concerné, il est possible de l'ouvrir, le copier.... sauf que, quand on utilise le nom complet pour manipuler le fichier (typiquement copy "c:\dossier\sdossier\...monfichier.ods" "destination") windows devient récalcitrant sauf à utiliser deux biais existants :
- créer un répertoire de substitution d'une partie de l'arborescence (Subst "c:\dossier\sdossier\...\ssdossier" "Z:")
- utiliser Robocopy au lieu de Copy


A moins d'avoir fait une bourde dans mon code, lorsque je passe récupérer l'url du fichier dans les répertoires avec fileaccess.getFolderContent lorsque le nom fait plus de 256 carac le retour est vide (plus Empty que Null)

Merci pour ton aide
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
cypher.sephiroth
Membre OOrganisé
Membre OOrganisé
Messages : 90
Inscription : 09 janv. 2012 17:10
Localisation : 31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par cypher.sephiroth »

JeanNoduRhone a écrit : Sous l'explorateur Windows il est possible d'explorer toute l'arborescence jusqu'au fichier concerné, il est possible de l'ouvrir, le copier.... sauf que, quand on utilise le nom complet pour manipuler le fichier (typiquement copy "c:\dossier\sdossier\...monfichier.ods" "destination") windows devient récalcitrant sauf à utiliser deux biais existants [...]
Troisième biais : se déplacer dans le dossier initial à l'aide de la commande "cd" (Change directory) et faire ce qui doit être fait.
 Ajout : Moi, je veux bien aider, mais mettre à disposition un fichier dont les feuilles sont protégées par mot de passe et ne pas fournir ce dernier, euh... Pour comprendre la logique sous-jacente, c'est hard. 
J'utilise LibreOffice 4.3.6.2 sur Windows 7 64 bits pro
--
Et parfois, ça fait "Coin !"...
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

:roll: ... le mot de passe des feuilles est en dur dans le code
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26215
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par Dude »

JeanNoduRhone a écrit :Le problème des noms longs mais limités à 256 caractères est un problème récurrent sous Windows
Depuis les versions Unicode de Windows, l'API semble avoir évolué et dépassé cette limite : voir article MSDN
JeanNoduRhone a écrit :Sous l'explorateur Windows [...] quand on utilise le nom complet pour manipuler le fichier (typiquement copy "c:\dossier\sdossier\...monfichier.ods" "destination") windows devient récalcitrant
Et...
Dude a écrit :Calc s'appuie sur le système d'exploitation qui l'héberge.
Donc si Windows ne peut pas manipuler le fichier comme tu le dis, Calc ne pourra faire mieux.
Avatar de l’utilisateur
cypher.sephiroth
Membre OOrganisé
Membre OOrganisé
Messages : 90
Inscription : 09 janv. 2012 17:10
Localisation : 31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par cypher.sephiroth »

Bonjour,

Suite à un test personnel, LibreOffice 4.3.5.2 (Windows 7 pro 64 bits) plante la macro à l'écriture d'un fichier dont le nom fait 260 caractères. Texte d'erreur : "Erreur d'entrée/sortie de périphérique".
Est-ce que quelqu'un peut confirmer ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
J'utilise LibreOffice 4.3.6.2 sur Windows 7 64 bits pro
--
Et parfois, ça fait "Coin !"...
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

Bonjour,

Je te confirme, j'ai aussi eu ce message à la recopie lorsque j'ajoute le répertoire cible de l'archivage
De mon coté, je vais profiter du Week End qui arrive pour modifier mon code de façon à me positionner dans les sous dossiers avant lecture , filecopy ou kill et je te tiens au courant.
LibrOffice Mimo 4.3.4 sur Win 7
bm92
ManitOOu
ManitOOu
Messages : 2562
Inscription : 26 nov. 2005 13:42

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par bm92 »

Bonjour,
Sous Windows 7 Home, j'ai créé un fichier dont le chemin est C:\_Docs\zzz\machin.txt.
Je l'ai ensuite renommé avec le gestionnaire de fichiers, en remplaçant la partie nom avec la recopie de ceci:
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Cette séquence fait 261 caractères (sélectionnez la ligne et le début de la suivante, et faites un copier/coller sur un éditeur de texte).
Le chemin résultant est :
C:\_Docs\zzz\abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefgh.txt
Le nom du fichier est tronqué par rapport à ce que j'avais copié (vérifiez par copier/coller).
Il se trouve que si on prend le chemin sans l'extension, on a une longueur de 255 caractères.
Ma version de Windows n'accepte donc pas plus. Ainsi, à la question du fil je réponds : impossible.

Ensuite j'ai fait cette macro:

Code : Tout sélectionner

Sub Main
Dim fp As Object, lesFichiers() As String, chem As String

fp= CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
if fp.execute > 0  then
  lesFichiers() = fp.Files
  chem = ConvertFromURL(lesFichiers(0))
  MsgBox(chem & chr(13) & "Longueur : " & Len(chem))
end if
End Sub
J'ai sélectionné mon fichier, le message donne:
NomLong.png
L'API a bien récupéré le chemin complet.
On remarque dans cette syntaxe Windows le préfixe \\?\ signalant un chemin long (voir l'article MSDN cité).
La taille obtenue est égale à 4 (préfixe) +255 (chemin) +4 (extension)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Bernard

OpenOffice.org 1.1.5 fr / Apache OpenOffice 4.1.1 / LibreOffice 5.0.5.2 (X64)
MS-Windows 7 SP1 64bits Familial
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26215
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par Dude »

J'ai à mon tour fait le test suivant.
Connexion du client Win7 x64 à un serveur Linux Samba avec le chemin suivant :

Code : Tout sélectionner

\\FRELON\Sauvegarde\Temp\dossiers_extremement_longs_de_2014\constatation_du_probleme\dude_avec_AOO_410_sous_Windows7x64_Pro\volume_sous_samba4\serveur_sous_debian_wheezy\voyons_voir_si_ca_fonctionne\avec_un_chemin_vers_un_document_qui_depasse_256_caracteres
Longueur : 257 caractères

Et pourtant, je peux ouvrir un document à l'intérieur d'un tel chemin :
_marrant.png
Comment ? Pour assurer une compatibilité d'ouverture du fichier, Windows substitue la chaîne par une autre :

Code : Tout sélectionner

\\FRELON\Sauvegarde\Temp\DL90E0~E\CGVVG1~J\DZ3Q7E~V\VCCMVL~9\S6RTDH~B\VSDV07~C\AQIE66~G
Longueur : 87 caractères
bm92 a écrit :Ainsi, à la question du fil je réponds : impossible.
Dude a écrit :Donc si Windows ne peut pas manipuler le fichier comme tu le dis, Calc ne pourra faire mieux.
CQFD

Fil à passer [Résolu] :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par JeanNoduRhone »

Bonjour Dude,

Il s'agit de la fameuse notation 8.3 des noms de répertoires et de fichiers sur laquelle j'ai planché un peu cette semaine.
Pour contourner la difficulté des noms longs (non accessibles par Dir ou par SimpleFileAccess), j'ai cherché à récupérer cette info.
Elle est accessible dans LibreOffice par un objet FileSystemObject.
Cet objet possède 3 collections : Drives, Folders et Files qui contiennent les informations sur les lecteurs, répertoires et fichiers notamment le shortname (cette fameuse notation)
Pour l'instant je sais accéder à un élément individuel de la collection Folders ou Files :

Code : Tout sélectionner

Sub proprietesFichier_getFile( Fichier As String, provenance as Integer ) 
  Dim oObj As Object , Cible As Object 
  Dim Valeur As Object , Repert as Object
  Dim Resultat As String 
if FileExists(Fichier) then  
  oObj = createUnoService("com.sun.star.bridge.OleObjectFactory")  
  Cible = oObj.createInstance("Scripting.fileSystemObject")
  
  if provenance=0 then ' 0 on a passé un fichier en paramètre
    Valeur=Cible.GetFile(Fichier) 
    Resultat = "Chemin : " & Valeur.ParentFolder.Path & Chr(10) & Chr(10) & _ 
    "Chemin court : " & Valeur.shortpath & Chr(10) & Chr(10) & _ 
    "Nom court : " & Valeur.ShortName & Chr(10) & Chr(10) & _ 
    "Date creation : " & CDate( Valeur.DateCreated.Value ) & Chr(10) & Chr(10) & _ 
    "Date derniere modification : " & CDate( Valeur.DateLastModified.Value ) & Chr(10) & Chr(10) & _ 
    "Date dernier acces : " & CDate( Valeur.DateLastAccessed.Value ) & Chr(10) & Chr(10) & _ 
    "Taille fichier : " & Valeur.Size & " octets" & Chr(10) & Chr(10) & _ 
    "Type fichier : " & Valeur.Type & Chr(10) & Chr(10) & _ 
    "Extension fichier : " & Cible.GetExtensionName(Valeur) & Chr(10) & Chr(10) & _ 
    "Nom fichier sans extension : " & Cible.GetBaseName(Valeur) & Chr(10) & Chr(10) & _ 
    "Nom fichier : " & Cible.GetFileName(Valeur) & Chr(10) & Chr(10) & _ 
    "Chemin et nom complet : " & Cible.GetAbsolutePathName(Valeur) 
  else   ' 1 on a passé un répertoire
    Valeur=Cible.GetFolder(Fichier) 
     Resultat ="Chemin court : " & Valeur.shortname & Chr(10) & Chr(10) & _ 
    "path : " & Valeur.Path & Chr(10) & Chr(10) & _
     "parent Folder : " & Valeur.ParentFolder & Chr(10) & Chr(10) & _  
    "Nom fichier sans extension : " & Cible.GetBaseName(Valeur) & Chr(10) & Chr(10) & _ 
    "Nom fichier : " & Cible.GetFileName(Valeur) & Chr(10) & Chr(10) & _
    "Chemin et nom complet : " & Cible.GetAbsolutePathName(Valeur)   
  end if
     
  MsgBox Resultat 
 end if
End Sub
Mais pour lister les éléments de la collection c'est une autre paire de manches. La littérature Microsoft dit qu'il s'agit de collections particulières non accessibles par un index (sic). Et effectivement s'il y a bien une propriété Count, faire un for i=0 to maCollection.Count -1 ne marche pas et je ne sais pas faire le code pour un "For each Item In MaCollection" utilisée en VB.

Alors, si tu es d'accord, j'attends un petit peu de temps (si quelqu'un au hasard a été confronté aux listage de collections particulières) avant de passer en [Résolu]
Si quelqu'un peux m'aider sur ce
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26215
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Récupérer des noms de fichiers >256 Caractères

Message par Dude »

Je n'ai pas compris ton histoire.
En utilisant le bout de code de bm92, on récupère le chemin raccourci à 110 caractères :
_macro.png
Comme dit à 3 reprises : Basic ne fait qu'afficher ce que Windows lui retourne.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
JeanNoduRhone
Fraîchement OOthentifié
Messages : 8
Inscription : 11 mars 2015 17:31

[Resolu][Calc] Récupérer des noms de fichiers >256 Caractère

Message par JeanNoduRhone »

Dude a écrit :Je n'ai pas compris ton histoire.
En utilisant le bout de code de bm92, on récupère le chemin raccourci à 110 caractères :
Comme dit à 3 reprises : Basic ne fait qu'afficher ce que Windows lui retourne.
Le FolderPicker lui remonte Empty s'il est exposé à un chemin très long... c'est toute mon histoire.
Je passe ce fil en [Résolu] m^me si cela ne répond pas à mon problème. En tout cas merci
LibrOffice Mimo 4.3.4 sur Win 7
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 10135
Inscription : 28 août 2010 08:45

Re: [Résolu][Calc]Récupérer des noms de fichiers >256 Caract

Message par micmac »

Bonjour,
[b][color=#404080]JeanNoduRhone[/color][/b] a écrit :Je passe ce fil en [Résolu]
Problème résolu ? Merci d'ajouter la balise [Résolu] au début du titre de votre premier message et de cocher l'icône Image

Voyez comment faire.

Nous l'avons fait pour vous cette fois.

Cordialement
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS