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
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 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
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 ?
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.
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 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
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("")
Dim type As New UnicodeEncoding Dim encodedBytes As Byte() = type.GetBytes(arr(i)) Dim decodedString As String = type.GetString(encodedBytes) MsgBox(decodedString)
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
17 déc. 2014 à 20:53