cs_azerty25
Messages postés1114Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention 6 mai 2007
-
3 juil. 2005 à 00:35
cs_azerty25
Messages postés1114Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention 6 mai 2007
-
9 juil. 2005 à 21:51
Hello tout le monde
J'ai besoin de créer tout une floppée de dossiers et apparament, on est limité avec cette API. J'aimerai par exemple créer en une fois c:\x\x\x\x\x mais je peux pas créer plus de 3 dossiers à la suite (c:\x\x\x) après la racine, sinon, l'API renvoye 0 et ne créé rien. Il y a t-il une solution ?
private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Sub Command1_Click()
'KPD-Team 1998
'URL: http://www.allapi.net/ 'E-Mail: [mailto:KPDTeam@Allapi.net KPDTeam@Allapi.net]
Dim Security As SECURITY_ATTRIBUTES
'Create a directory
Ret& = CreateDirectory("C:\Directory", Security)
'If CreateDirectory returns 0, the function has failed
If Ret& = 0 Then MsgBox "Error : Couldn't create directory !", vbCritical + vbOKOnly
End Sub
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 3 juil. 2005 à 00:56
Salut
En fait, avec ce genre de commande, il faut utiliser la récursivité (répétition avec progression) pour créer chacun des répertoires racine, puis les suivants.
Je te propose ce code qui utilise le FileSystemObject (scripting) qu'il faut d'abord déclarer comme objet :
Public Sys As Object ' FileSystemObject
puis, dans la Main ou dans ton Form_Load, ouvrir l'objet :
Set Sys = CreateObject("Scripting.FileSystemObject")
et la routine :
Public Function CrééRépertoires(ByVal Chemin As String) As Boolean
' On construit l'arborescence en partant du début
' (permet de recontruire un arbre entier)
Dim S() As String, Temp As String, r As Long
On Error GoTo Erreur
CrééRépertoires = False
If Sys.FolderExists(Chemin) Then
CrééRépertoires = True
Exit Function
End If
S = Split(Chemin, "")
For r = 0 To UBound(S)
Temp = Temp & S(r) & ""
If Not Sys.FolderExists(Temp) Then Sys.CreateFolder (Temp)
Next r
On Error Resume Next
DoEvents
If Sys.FolderExists(Chemin) Then
CrééRépertoires = True ' revérifie
End If
Erreur:
End Function
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 3 juil. 2005 à 05:26
salut voici un api qui fera l'affaire:
cet api revois si un chemin existe si non il le cree :)
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
Private Sub Command1_Click()
MakeSureDirectoryPathExists "c:\x1\x2\x3\x4\x5\x6"
End Sub
N.B:si tu ne mets pas \ a la fin le dernier dosier ne sera pas cree.ciao
<HR>
Life is short...Learn more
Copy Rights <> Rights to Copy
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 3 juil. 2005 à 01:02
J'oubliais : Pour utilise le FSO, il faut (pas obligatoire, mais vaut mieux pour l'empaquetage de la compilation) aussi aller dans le menu "Projet, Références" cocher la ligne de l'objet "Microsoft Scripting Runtime" qui est le fichier %System32%\scrrun.dll
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
cs_azerty25
Messages postés1114Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention 6 mai 2007 3 juil. 2005 à 10:04
Tout d'abord merci pour vos réponses !!!
Eh oui, c'est étrange, mais essayez vous même, vous serez supris ;)
En fait, c'est pas 3 sous dossiers max, ça à l'air aléatoire, j'ai pas réussi à trouver une explication.
Le code que j'ai écrit est le même code que j'ai utilisé pour les tests, celui de l'API Guide.
Merci aux 2 personnes qui ont donné du code, c'est vrai que la récursivité c'est sûr mais je trouve pas ça très propre et FSO, ba ça rajoute une DLL , et l'API de jack fonctionne également, c'est cela que je vais utiliser.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 3 juil. 2005 à 10:49
désolé je n'ai pas VB mais j'ai testé dans Excel, bien entendu ça passe nickel, je n'ai jamais vu CreateDirectory rater si on lui passe une chaine valide.
Je vois par contre que tu n'initialises pas le SECURITY_ATTRIBUTES, si tu n'en as pas besoin (la plupart des cas) alors il faut l'enlever et passer 0 mais surtout pas passer une adresse sur zone non initialisée comme il se doit.
Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, ByVal dummy As Long) As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim s As String
s = "D:\AAA"
If CreateDirectory(s, 0) = 0 Then GoTo noDir
s = s & "\AAA"
If CreateDirectory(s, 0) = 0 Then GoTo noDir
s = s & "\AAA"
If CreateDirectory(s, 0) = 0 Then GoTo noDir
s = s & "\AAA"
If CreateDirectory(s, 0) = 0 Then GoTo noDir
s = s & "\AAA"
If CreateDirectory(s, 0) = 0 Then GoTo noDir
Exit Sub
noDir:
MsgBox s, vbCritical
End Sub
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 3 juil. 2005 à 16:36
Ben alors la voilà l'explication!!!
Tu veux dire que si on n'initialise pas cette variable de type utilisateur elle n'est pas considéré comme étant à "0" !!!
Y'a un truc que je pige pas dans les APIs... Est-ce que, lorsqu'on a
une structure (comme la Security_Attributes), il est obligatoire ou non
de la "mettre" (c'est à dire, la déclarer et l'utiliser sans valeur) ou
non ??? Et si c'est non, pourquoi ??? Un simple "0" est
structurellement bien différent d'une structure même vide non!?!? Je
dis une connerie ???
Est-ce que, dans ton infinie mansuitude, tu pourrais, ho toi le grand
Chat, expliquer aux newbies comme moi, avec ta grande connaissance de
ce domaine obscure et ta traditionnelle sagesse, le pourquoi du comment
un truc pareil est possible ???
cs_MasterHack
Messages postés586Date d'inscriptionjeudi 18 septembre 2003StatutMembreDernière intervention13 février 20082 3 juil. 2005 à 17:01
oui c important car le type attendu de l'api c ça,mais lui mettre la valeur ou non,là ça depend de l'api.par exemple l'api GetWindowRect qui utilise le type RECT ne demande pas l'initialisation de la variable de ce type RECT mais c l'api lui meme qui retourne des valeur a la variable.ce qui n'est pas le cas de L'api setcursorpos qui utilise les variable de type POINTAPI.ciao
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 3 juil. 2005 à 17:02
Ce qu'on passe c'est une adresse, si tu passes 0 API considère que tu ne fournis rien donc va bon (bien lire la doc API pour vérifier qu'elle accepte ce discours bien entendu).
Si par contre tu fournis l'adresse d'une struct, ses membres doivent être correctement initialisés sinon API retourne une erreur.