Pro

Résolu
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007 - 3 juil. 2005 à 00:35
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Derniè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

@Z3RtY25 ==

14 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
3
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
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
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 juil. 2005 à 05:12
Mais sans ça, j'aimerais bien voir ton code car ce que tu nous dis là m'étonne énormément !!!

Il n'y a aucune raison pour que l'API ne fonctionne plus au bout de 3
coups!!! Non, a mon avis, le problème se trouve dans ton code concrêt!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 juil. 2005 à 06:08
Dit moi Master, c'est pas un API exclusive XP par hasard ???
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
3 juil. 2005 à 06:14
ScSami>non non pas du tout ça marche sur > win95 et pour NT a partir de 3.1.ciao,vas dormi lol


<HR>

Life is short...Learn more
Copy Rights <> Rights to Copy
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 juil. 2005 à 06:19
CLAIR

Désolé...
0
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Derniè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.

@Z3RtY25 ==
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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

ciao...
BruNews, MVP VC++
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
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 ???


Merci par avance
0
cs_MasterHack Messages postés 586 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 13 février 2008 2
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

Ultra simple, non ?

ciao...
BruNews, MVP VC++
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 juil. 2005 à 17:07
Humm... attends... laisse moi réfléchir...

Oui! En effet! Dit comme ça c'est plutôt simple!



Merci pour ces explications.
0
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
9 juil. 2005 à 21:51
Merci pour les explications !

@Z3RtY25 ==
0
Rejoignez-nous