Listbox et caractère spéciaux

Rykudos - 17 déc. 2014 à 13:04
 Rykudos - 21 déc. 2014 à 16:42
Bonjour, je développe un client ftp et je fait face a 2 problème. mon 1er et que je liste le contenue d'un dossier (sur serveur) dans une listbox, ci le nom dossier contiens un accent il m'affiche dans la listbox un losange noir. j'ai essayer de convertir la chaine de caractère dans tous les encodage possible mais rien a faire sa marche pas ! pour certains encodage il me retourne un "?" au lieu du losange mais rien de plus =/



Sub listeftp()

Try

Dim arr() As String
Dim request As FtpWebRequest = WebRequest.Create(logftp(0) + "/" + TextBox4.Text)
request.Credentials = New NetworkCredential(logftp(1), logftp(2))
request.Method = WebRequestMethods.Ftp.ListDirectory

Dim response As FtpWebResponse = request.GetResponse()
Dim responseStream As Stream = response.GetResponseStream()
Dim reader As StreamReader = New StreamReader(responseStream)
Dim lol As String


nbFichier = 0
nbDossier = 0
ListBox1.Items.Clear()

Do
lol = reader.ReadLine
If Len(lol) < 1 Then Exit Do
arr = Split(lol, vbNewLine)
For i = 0 To UBound(arr)
If Len(arr(i)) > 0 Then

Call Main(arr(i))
ListBox1.Items.Add(newstring)

If arr(i) Like "*.*" = True Then
nbFichier = nbFichier + 1
End If
If arr(i) Like "*.*" = False Then
nbDossier = nbDossier + 1
End If

End If
Next
Loop

reader.Close()
response.Close()
request.Abort()

Catch ex As Exception

If ex.Message = "Impossible de se connecter au serveur distant" Then
MsgBox("Déconnéction internet !")
End If
If ex.Message Like "*Le nom distant n'a pas pu être résolu:*" = True Then
MsgBox("URL non valide !")
End If
If ex.Message = "Le préfixe URI n'est pas reconnu." = True Then
MsgBox("URL non valide !")
End If
If ex.Message = "Le serveur distant a retourné une erreur : (530) Non connecté." Then
MsgBox("Identifiant non valide !")
End If


Call reset()

End Try

Label1.Text = nbFichier
Label2.Text = nbDossier
End Sub

Dim newstring As String
Sub Main(str)
Dim strings() As String = {str}

Dim asciiEncoding As Encoding = Encoding.UTF8

' Create array of adequate size.
Dim bytes(50) As Byte
' Create index for current position of array.
Dim index As Integer = 0

Console.WriteLine("Strings to encode:")
For Each stringValue In strings
Console.WriteLine(" {0}", stringValue)

Dim count As Integer = asciiEncoding.GetByteCount(stringValue)
If count + index >= bytes.Length Then
Array.Resize(bytes, bytes.Length + 50)
End If
Dim written As Integer = asciiEncoding.GetBytes(stringValue, 0,
stringValue.Length,
bytes, index)

index = index + written
Next
Console.WriteLine()
Console.WriteLine("Encoded bytes:")
Console.WriteLine("{0}", ShowByteValues(bytes, index))
Console.WriteLine()

' Decode Unicode byte array to a string.
newstring = asciiEncoding.GetString(bytes, 0, index)

End Sub

Private Function ShowByteValues(bytes As Byte(), last As Integer) As String
Dim returnString As String = " "
For ctr As Integer = 0 To last - 1
If ctr Mod 20 = 0 Then returnString += vbCrLf + " "
returnString += String.Format("{0:X2} ", bytes(ctr))
Next
Return returnString
End Function



''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

mon 2em problème et que l'orsque je souhaite créer un dossier sur un serveur dont le nom contient un point sa ne marche pas =/



Sub envoidossier()

Try
My.Computer.FileSystem.DeleteFile("tmp_listelocal.txt")
Catch ex As Exception

End Try

Try
Dim sw0 As StreamWriter
sw0 = File.CreateText("tmp_listelocal.txt")
sw0.Close()
Catch ex As Exception

End Try

Call listerecursivelocal(dossierenvoyer)


If File.Exists("tmp_listelocal.txt") = True Then

Dim Lignes() As String = File.ReadAllLines("tmp_listelocal.txt")
Dim nLignes = Lignes.Length


Dim nmdossierracine = My.Computer.FileSystem.GetDirectoryInfo(dossierenvoyer).Name
For i = 0 To nLignes - 1

Dim y = My.Computer.FileSystem.GetFileInfo(Lignes(i)).Extension



If y = "" Then
Dim a = Len(nmdossierracine)
Dim repftp = dossierenvoyer
repftp = Strings.Left(repftp, Len(repftp) - a)
Dim b = Len(repftp)
repftp = Lignes(i)
repftp = Strings.Right(repftp, Len(repftp) - b)


Dim urlftp = Form1.logftp(0) + "/" + Form1.TextBox4.Text + "/" + repftp

Dim requete As FtpWebRequest = Nothing
Dim reponse As FtpWebResponse = Nothing
Try
requete = CType(FtpWebRequest.Create(New Uri(urlftp)), FtpWebRequest)
requete.Method = WebRequestMethods.Ftp.MakeDirectory
requete.UseBinary = True
requete.Credentials = New NetworkCredential(Form1.logftp(1), Form1.logftp(2))
reponse = CType(requete.GetResponse, FtpWebResponse)
requete.Abort()

Catch ex As Exception


'''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''

End Try
End If


If y = "" = False Then

Dim a = Len(nmdossierracine)
Dim repftp = dossierenvoyer
repftp = Strings.Left(repftp, Len(repftp) - a)
Dim b = Len(repftp)
repftp = Lignes(i)
repftp = Strings.Right(repftp, Len(repftp) - b)

Dim urlftp = Form1.logftp(0) + "/" + Form1.TextBox4.Text + "/" + repftp
Dim fichlocal = Lignes(i)

Try
My.Computer.Network.UploadFile(fichlocal, urlftp, Form1.logftp(1), Form1.logftp(2))
Catch ex As Exception

'''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''

End Try

End If

Next

End If


End Sub


4 réponses

j'ai trouver ce qui ne vas pas dans mon 2em problème cela viens de la méthode que j'utilise pour détecter si l'élément que j'ai a envoyer sur le serveur est un fichier ou un dossier (si c un dossier je le créer, si c un fichier je l'envoi)


Dim y = My.Computer.FileSystem.GetFileInfo(Lignes(i)).Extension

If y = "" Then
'créer dossier sur serveur
end if

If y = "" = false Then
'envoi fichier sur serveur
end if


si le dossier contient un point il me retourne une extension dans y donc il essaie de l'envoyer comme un fichier d'où mon problème!
quelqu'un connais une méthode béton pour savoir si j'ai a faire a un fichier ou un dossier avec une adresse type ("c:/temp.1" pour un dossier ou "c:/temp.1/fichier.txt" pour un fichier ) svp ?
0
2em problème résolut ,il ne reste plus qu'a trouver comment afficher les caractère spéciaux dans la listbox .
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
17 déc. 2014 à 20:04
0
bonjour et merci pour ta réponse j'ai regarder le lien que tu ma proposer et essayer la fonction proposer par cs_le pivert sa me crypte ma chaine de caractère du coup j'ai essayer de décrypter pour voir si sa m'afficher les accents mais sa me retourne une chaine vide. je ne vois pas comment changer seulement l'encodage de ma chaine de caractère avec cette exemple.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
Modifié par NHenry le 17/12/2014 à 20:51
Il faut que tu modifies ta ligne :
Dim count As Integer = asciiEncoding.GetByteCount(stringValue)
ainsi que toutes les occurences de asciiEncoding
0
il faut que je modifie quoi sur la ligne ? car j'ai essayer de modifier cette ligne

Dim asciiEncoding As Encoding = System.Text.Encoding.ASCII

en ajoutant tous les encodage possible
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
18 déc. 2014 à 11:25
Bonjour,

As -tu essayé ceci:

  Dim asciiEncoding As Encoding = System.Text.Encoding.Default
0
bonjour, oui j'ai essayer cette ligne avec ascii, utf8, utf7, utf32, unicode, bigendian et default soit sa me retourne un losange noir ou un "?"
0
j'ai également essayer dans la boucle ou je liste le contenu du serveur d'enregistrée ma chaine de caractère dans tous les encodage mais sa fait la même chose dans un fichier texte.


Using writer As New StreamWriter("tmp.txt", False, Encoding.BigEndianUnicode)
writer.WriteLine(arr(i))
End Using
MsgBox("")
0
j'ai tester sa aussi mais toujours la même chose


Dim type As New UnicodeEncoding
Dim encodedBytes As Byte() = type.GetBytes(arr(i))
Dim decodedString As String = type.GetString(encodedBytes)
MsgBox(decodedString)
0
si j'affiche le code ascii de chaque caractère dans la chaine il me donne 63 pour tous les caractère spéciaux

For a = 0 To arr(i).Length
Try
Dim u = (Mid(arr(i), a, 1))
TextBox5.AppendText(Asc(u))
Catch ex As Exception

End Try

Next
TextBox5.AppendText("" & vbCrLf)
0
bon ne trouvant pas de solution j'ai fini par lister mon serveur avec un batch dans le cas ou la listbox contiens un "?".
un peut plus long le temps de traiter la liste, mais au moins comme sa je peut convertir les accents...

par-contre j'ai une dernière question lorsque l'on fait un listdirectorydetail ou une liste du serveur via un batch le format de la liste retourner est toujours comme sa :

drwxr-xr-x 5 33 www-data 192 Dec 16 22:19 a.1
drwxr-xr-x 3 33 www-data 104 Dec 17 19:22 aa
drwxr-xr-x 2 33 www-data 48 Dec 17 21:37 aa.z
drwxr-xr-x 2 33 www-data 48 Dec 18 21:45 a'
drwxr-xr-x 2 33 www-data 48 Dec 18 21:46 ''
-rw-r--r-- 1 33 www-data 0 Dec 17 19:18 za.txt

ou sa dépend du serveur ?
0
Rejoignez-nous