Pro

Résolu
Signaler
Messages postés
1114
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007
-
Messages postés
1114
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007
-
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

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
586
Date d'inscription
jeudi 18 septembre 2003
Statut
Membre
Dernière intervention
13 février 2008
2
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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)
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
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!!!
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
Dit moi Master, c'est pas un API exclusive XP par hasard ???
Messages postés
586
Date d'inscription
jeudi 18 septembre 2003
Statut
Membre
Dernière intervention
13 février 2008
2
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
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
CLAIR

Désolé...
Messages postés
1114
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007

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 ==
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
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
Messages postés
586
Date d'inscription
jeudi 18 septembre 2003
Statut
Membre
Dernière intervention
13 février 2008
2
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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
Humm... attends... laisse moi réfléchir...

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



Merci pour ces explications.
Messages postés
1114
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007

Merci pour les explications !

@Z3RtY25 ==