Open et les caractères accentués

Résolu
-
 Utilisateur anonyme -
Bonjour,

J'ai l'habitude d'utiliser "open" plutôt que le fso pour accéder aux fichiers mais je me suis aperçu récemment qu'il était impossible d'ouvrir un fichier contenant dans son nom des caractères comme "s," (celui-là est utilisé dans l'alphabet Turc par exemple). Je me suis aussi aperçu que ça faisait buggé pas mal de sources sur vbfrance







Voila ce que je voudrais faire :

Open "c:\test\fichiers.txt" For Binary As #intFilePointer

Existe-t'il une astuce pour y parvenir malgré tout?

12 réponses

Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
73
tu peux utiliser les APIs de lecture de fichier... CreateFile, etc

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
73
pour la cedille, faire, simplement :


sBuffer = "C:\Hello" & ChrW$(&H15F) & ".txt"


et pour les apis (la version Unicode a utiliser), ne pas passer sBuffer (String) mais un Long :

StrPtr ( sBuffer)


pour éviter que VB ne s'amuse a convertir la chose en ASCII

Renfield
Admin CodeS-SourceS- MVP Visual Basic

ça c'est un comble le caractère en question ne passe pas non plus ici :d
voila une image pour illustrer mes propos :
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
C'est sûr, le point d'interrogation ? n'est pas autorisé dans un nom de fichier puisqu'il représente un caractère de substitution sous DOS. (et l'étoile * pour le remplacement de plusieurs caractères).
Bizarre.
Je n'ai pas l'expérience de l'influence des langues sur le comportement de VB, mais je pense que c'est un problème de version.
Je pense que les capacités à reconnaitre un nom de fichier ne dépend pas de VB, mais de l'OS (Windows XP ?)
L'orthographe de ces fichiers sont-il correctement interprété par le gestionnaire de fichiers classique (Poste de travail) ? Si un de tes fichiers comporte un de ces S avec une cédille, est-ce qu'il l'affiche bien ? ou il y a t-il un carré blanc à la place (ou autre) ?
Si non, cela confirme que VB n'y est pour rien et que le problème est total sur toute la machine = problème d'installation de l'OS
Si oui, je ne comprends pas trop d'où pourrait venir cette restriction, car (si je ne m'abuse), les String de VB ont un format natif Unicode.
Essaye de séparer le nom du fichier de l'instruction Open :
   Dim monFichier As String
   monFichier = "c:\test\fichier?.txt"
   Open monFichier For Binary As #intFilePointer

et voit si l'erreur arrive sur l'écriture de monFichier ou toujours sur la ligne du Open (supprime un éventuel "On Error Resume Next" de ta procédure, OU dans VB, menu Outils, Options, onglet Général, choisir "Arrêt sur toutes les erreurs")
Quel est le n° et le texte de l'erreur qui apparait ? (pour être sûr que le problème vienne bien de là)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
PS : Bien sûr, dans le nom du fichier, remplace le ? par ce S avec cédille

Bonjour et merci pour ta réponse :)

En fait il s'agit d'un problème avec un serveur web (ma source "http explorer" sur vbfrance) et c'est un problème très étrange. A la récupération d'une requête vers un fichier dont le nom contient ce caractère, je stock le chemin local complet de ce fichier à renvoyer au client dans une variable et je m'apercois que :

- un fso.FileExists(strLocalPath) renvoi true sur ce fichier (jusque la normal).
- un msgbox(strLocalPath) m'affiche le nom du fichier avec le "s" mais sans cédille (caractère 's' normal 73&, bizarre...)
- un msgbox(convToUtf8(strLocalPath)) m'affiche le s avec la cédille convertie en utf8 (c:\test\fichierÅŸ.txt, là normal)
- et enfin (le problème) : un open strLocalPath For Binary As #intFilePointer me créé un fichiers.txt si le fichier d'origine était fichier?.txt. open a donc lui aussi remplacé le s avec cédille par 's' et je me retrouve avec deux fichiers :d

Dans


tout


les cas ci-dessus,



strLocalPath



à toujours le même contenu...







Quelque chose m'échappe...

ok merci je vais essayé avec ça et je te dis quoi 

C'est bon merci beaucoup ça marche niquel ;)

Juste une dernière question à propos des APIs de lecture de fichiers : sais-tu comment utiliser l'api SetFilePointer avec des fichiers > 4gb ?

http://www.allapi.net/apilist/SetFilePointer.shtml

J'ai déjà lu 100 fois mais en pratique ça à pas l'air de marcher et sur le net y'a pas énormément d'exemple avec vb6 :/

J'ai aussi testé ce code trouvé sur un site mais ça fonctionne pas :d

Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

Dim varvalue As Long
Dim varaddr As Long

varvalue = 2                    ' assign a value to a variable.
varaddr = VarPtr(Var)           ' get the address in memory of the variable.
Call SetFilePointer(FilePointer, 0, varaddr, 0)
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
73
tu peux simplement appeler cette fonction plusieurs fois ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic

C'est sûr mais c'est pas terrible :d

Le problème c'est que je vois mal comment appeler l'api avec pour

lpDistanceToMoveHigh

une valeur de 7 milliards (par ex) sur une variable de type long limité à 4 milliards et quelque.
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
73
je viens de regarder la doc...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/setfilepointer.asp


tu as deux Long a ta disposition, soit 64 bits, soient quelques

18 446 744 073 709 551 616


ca devrait pourtant suffir !


7 000 000 000 => &h1A13B8600


lDistancetomove =>  &hA13B8600&

lpDistanceToMoveHigh =>  adresse de &h1&

Renfield
Admin CodeS-SourceS- MVP Visual Basic

Merci du coup de main ça marche impec