Bonjour,
est-il possible d'obtenir le chemin complet d'un répertoire partagé d'un ordinateur quelconque du réseau ?
Merci
Bonjour,
est-il possible d'obtenir le chemin complet d'un répertoire partagé d'un ordinateur quelconque du réseau ?
Merci
BONJOUR?
Je ne l'ai plus en tête mais il y a une fonction du genre GetUNCPathName() qui donne le chemin complet.
(Je suis sûr qu'il y a UNC dans le nom de la fonction, pour le reste l'aide devrait faire l'affaire)
devYan.
J'ai trouvé une fonction "ScLocalPathFromUNC", mais je ne trouve pas à quelle uses elle est rattachée
Je lai retrouvé, il s'agit de ExpandUNCFileName(). 8)
devYan.
Après test, en fait je veux l'inverse
Je récupère le nom de répertoire au format : \\serveur\repertoire\
Et je voudrais le chemin complet sur le disque réseau lecteur:\repertoire....
Bonjour,
Je suis "à nouveau" débutant en delphi (après une courte interruption d'une dizaine d'années...) mais il me semble que le code suivant pourrait être une piste. Le principe, c'est d'utiliser NetShareEnum pour obtenir la liste des ressource partagées d'une machine.
Connaissant le drive paratagé et son UNC: \\Host\NomPartage, ce programme donne la correspondance entre NomPartage et le chemin réel drive:\rep1\Rep2 etc. ce qui doit pouvoir résoudre le problème...
(Attention, programme en cours d'écriture et non testé, en cours de traduction depuis un autre langage).
Cordialement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203 unit GetSharedRessource; interface uses windows, ContNRS; const // NetShareEnum renvoie ERROR_SUCCESS si Ok, et ERROR_MORE_DATA si Ok mais pas tout lu => Autre appel nécessaire pur continuer ERROR_MORE_DATA=234; ERROR_SUCCESS=0; // Pour debugger le resume, utiliser 1000 sur proliant MAX_PREFERRED_LENGTH=-1; (* SHARE_INFO_2=2 // {&SHARE_INFO_2} => On obtient ce type de structure, contenant le nom de partage et le path réel. typedef struct _SHARE_INFO_2 { LPWSTR shi2_netname; 4 Adresse de la chaîne ! DWORD shi2_type; 4 LPWSTR shi2_remark; 4 Adresse de la chaîne ! DWORD shi2_permissions; 4 DWORD shi2_max_uses; 4 DWORD shi2_current_uses; 4 LPWSTR shi2_path; 4 Adresse de la chaîne ! LPWSTR shi2_passwd; 4 } SHARE_INFO_2, *PSHARE_INFO_2, *LPSHARE_INFO_2; *) // Disk drive STYPE_DISKTREE=0; // Print queue STYPE_PRINTQ=1; //Interprocess communication (IPC) STYPE_IPC=-2147483645; // Special share reserved for interprocess communication (IPC$) or remote administration of the server (ADMIN$). Can also refer to administrative shares such as C$, D$, E$, and so forth. STYPE_SPECIAL=-2147483648; Function GetShare(pi_srv: String): String; Type // Liste des partages: Record et Table TSharedRes = Class(TObject) K_SHARE, PATH, LIB, K_TYPE // DISK, ADMIN, PRINTER, OTHER : String; I_TYPE : Integer; procedure Assign(SharedRes:TSharedRes) ; // trés utille pour affecter un enr à un autre procedure ClearRec ; // remet tout à la valeur initiale (nom='' ; K_Code='' par exemple) constructor create ; destructor Destroy; override; end; Ttt_SharedRes = Class(TObjectlist) function GetRec(i:integer) : TSharedRes ; procedure SetRec(i:integer;Rec :TSharedRes); property SharedRes[i:integer]:TSharedRes read GetRec write SetRec ; procedure Clear; constructor create; destructor Destroy; override; end; // Association entre un répertoire et des partages permettant d'y accèder TShareDir = class(TObject) K_DIR, K_SHARE : String; end; NET_API_STATUS = DWORD; PSHARE_INFO_2 = ^SHARE_INFO_2; SHARE_INFO_2 = record shi2_netname : PWideChar; shi2_type : DWORD; shi2_remark : PWideChar; shi2_permissions : DWORD; shi2_max_uses : DWORD; shi2_current_uses: DWORD; shi2_path : PWideChar; shi2_passwd : PWideChar; end; function NetShareEnum(ServerName : PWideChar; Level : DWORD; bufptr : Pointer; PrefMaxLen : DWORD; EntriesRead : PDWORD; TotalEntries : PDWORD; Resume_Handle: PDWORD):NET_API_STATUS; stdcall; external 'NetAPI32.dll' name 'NetShareEnum'; function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external 'NetAPI32.dll' name 'NetApiBufferFree'; var vSharedRes : TSharedRes; tt_SharedRes: Ttt_SharedRes; implementation // TSharedRes méthodes procedure TSharedRes.Assign(SharedRes:TSharedRes) ; // trés utille pour affecter un enr à un autre Begin end; procedure TSharedRes.ClearRec ; // remet tout à la valeur initiale (nom='' ; K_Code='' par exemple) Begin End; constructor TSharedRes.create ; Begin Inherited create; End; destructor TSharedRes.Destroy; Begin inherited Destroy; End; //Ttt_SharedRes méthodes function Ttt_SharedRes.GetRec(i:integer) : TSharedRes ; Begin Result:=TSharedRes(items[i]); End; procedure Ttt_SharedRes.SetRec(i:integer;Rec :TSharedRes); Begin Items[i]:=Rec; End; procedure Ttt_SharedRes.clear ; Begin inherited clear; End; constructor Ttt_SharedRes.create; Begin Inherited create; End; destructor Ttt_SharedRes.destroy; Begin Inherited Destroy; End; Function GetShare(pi_srv: String): String; const MAX_PREFERRED_LENGTH = -1; NERR_SUCCESS = 0; var ER : DWORD; // enries read TE : DWORD; // total entries ResHandle : DWORD; ShareInfo : PSHARE_INFO_2; p : pChar; fResult : NET_API_STATUS; i : Integer; vwc_srv : PWideChar; begin While tt_SharedRes.Count > 0 Do Begin tt_SharedRes.First; tt_SharedRes.Delete(0); end; New(vwc_srv); ResHandle := 0; StringToWideChar(pi_srv, vwc_srv, length(pi_srv)); fResult := NetShareEnum({nil} vwc_srv, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle); if(fResult <> NERR_SUCCESS)then Exit; p := Pointer(ShareInfo); for i := 0 to TE - 1 do begin vSharedRes := TSharedRes.Create; vSharedRes.K_SHARE := WideCharToString(PSHARE_INFO_2(p)^.shi2_netname); vSharedRes.PATH := WideCharToString(PSHARE_INFO_2(p)^.shi2_path); vSharedRes.I_TYPE := PSHARE_INFO_2(p)^.shi2_type; Case PSHARE_INFO_2(p)^.shi2_type of STYPE_DISKTREE: vSharedRes.K_TYPE := 'Disk'; STYPE_PRINTQ: vSharedRes.K_TYPE := 'PRINTER'; //STYPE_IPC: vSharedRes.K_TYPE := 'IPC'; //STYPE_SPECIAL: vSharedRes.K_TYPE := 'ADMIN'; else vSharedRes.K_TYPE := 'OTHER'; end; tt_SharedRes.Add(vSharedRes); p := p + SizeOf(SHARE_INFO_2); end; NetApiBufferFree(@ShareInfo); Dispose(vwc_srv); end; Begin end.
Flines.
Si tu connais le lecteur mappé,
tu peux faire un truc du style
vérifier la correspondances avec les slash, éventuellement avec Include ou ExcludePathDelimiter...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 UNCLecteur := GetUNCFileNAme( MonLecteur + ':\' ); MonCheminPasUNC := StringReplace( TonCheminUnc, UNCLecteur, MonLecteur + ':', [ rfReplaceAll ] );
Si tu ne connais pas le lecteur, il y a surement moyen de le retrouver mais j'ai pas de solution d'avance
Bon courage !
Section Delphi
La mine d'or: La FAQ, les Sources
Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
Notre revanche ? l'inverse est aussi vrai ;-)
Apparemment ce n'est possible que si le lecteur réseau est mappé.
Et dans mon cas je ne veux pas le faire.
Merci de votre aide, mais je vais essayer de contourner le problème.
TicTacToe,
Je pense que ce qu'il veut c'est depuis un PC A, récupérer le chemin "LOCAL" d'un dossier partage sur un PC B.
Exemple: Sur le PC B, on partage c:\Program Files\Borland avec le nom de partage "Borland". Depuis le PC A, on peut voir \\B\Borland. Mais pour avoir le chemin "LOCAL" de \\B\Borland, c'est à dire "C:\PRogram Files\Borland", il faut utiliser NetShareEnu en lui passant le nom ou l'IP du PC B. Dans mon exemple, il trouvera un SharedRes avec K_SHARE = 'Borland' et PATH = 'C:\Program Files\Borland'...
Flines
Exact, j'ai réalisé après !
Merci pour la précision.
donc j'ai toujours pas de solution
Section Delphi
La mine d'or: La FAQ, les Sources
Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
Notre revanche ? l'inverse est aussi vrai ;-)
Hé bien la solution c'est...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function NetShareEnum(ServerName : PWideChar; Level : DWORD; bufptr : Pointer; PrefMaxLen : DWORD; EntriesRead : PDWORD; TotalEntries : PDWORD; Resume_Handle: PDWORD):NET_API_STATUS; stdcall; external 'NetAPI32.dll' name
Bonjour,
merci pour les réponses
a partir du code de sinfoni, je l'ai réduit à
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 ResHandle := 0; fResult := NetShareEnum(nil, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle); if(fResult <> NERR_SUCCESS)then Exit; p := Pointer(ShareInfo); setlength(list, 0); for i := 0 to TE - 1 do begin share := WideCharToString(PSHARE_INFO_2(p)^.shi2_netname); path := WideCharToString(PSHARE_INFO_2(p)^.shi2_path); if path<>'' then path:=', '+path; setlength(list, length(list)+1); list[i] := (share+path); p := p + SizeOf(SHARE_INFO_2); end;
Il me reste juste un soucis avec
que me plante l'appli...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 NetApiBufferFree(@ShareInfo);
bonjour,
j'ai récupéré et modifier un code pour récupérer les chemin complet d'un dossier partagé.
tout fonctionne bien jusqu'à la commande NetApiBufferFree qui plante purement et simplement l'appli.
ci-dessous le code. Merci de votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 unit getshareressource; interface uses windows, ContNRS, SysUtils; type NET_API_STATUS = DWORD; SHARE_INFO_0 = record shi0_netname : PWideChar; end; PSHARE_INFO_0 = ^SHARE_INFO_0; SHARE_INFO_2 = record shi2_netname : PWideChar; shi2_type : DWORD; shi2_remark : PWideChar; shi2_permissions : DWORD; shi2_max_uses : DWORD; shi2_current_uses: DWORD; shi2_path : PWideChar; shi2_passwd : PWideChar; end; PSHARE_INFO_2 = ^SHARE_INFO_2; function NetShareEnum(ServerName : PWideChar; Level : DWORD; bufptr : Pointer; PrefMaxLen : DWORD; EntriesRead : PDWORD; TotalEntries : PDWORD; Resume_Handle: PDWORD):NET_API_STATUS; stdcall; external 'NetAPI32.dll' name 'NetShareEnum'; function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external 'NetAPI32.dll' name 'NetApiBufferFree'; function SearchCompleteFolder2(NetWorkFolder : string) : string; implementation function SearchCompleteFolder2(NetWorkFolder : string) : string; const MAX_PREFERRED_LENGTH = -1; NERR_SUCCESS = 0; var ER : DWORD; // enries read TE : DWORD; // total entries ResHandle : DWORD; ShareInfo : PSHARE_INFO_2; p : pChar; fResult : NET_API_STATUS; i : Integer; share, path : string; server, SharedFolder, Netpath : string; serverName : pwidechar; begin // Search server name, shared folder and the end of the path result := NetWorkFolder; if pos('\\', NetWorkFolder) = 1 then begin NetPath := copy(NetWorkFolder, 3, length(NetWorkFolder)); i := pos('\', NetPath); Server := '\\' + copy(NetPath, 1, i-1); Stringtowidechar(Server, Servername, length(server)+1); netPath := copy(NetPath, i+1, length(NetPath)); i := pos('\', NetPath); if i = 0 then begin Sharedfolder := NetPath; NetPath := ''; end else begin sharedfolder := copy(NetPath, 1, i-1); netPath := copy(NetPath, i+1, length(NetPath)); end; ResHandle := 0; fResult := NetShareEnum(servername, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle); if(fResult <> NERR_SUCCESS)then Exit; p := Pointer(ShareInfo); for i := 0 to TE - 1 do begin share := WideCharToString(PSHARE_INFO_2(p)^.shi2_netname); path := WideCharToString(PSHARE_INFO_2(p)^.shi2_path); if upperCase(Share) = uppercase(SharedFolder) then Result := path + NetPath; p := p + SizeOf(SHARE_INFO_2); end; NetApiBufferFree(@ShareInfo); end; end; end.
Merci de ne pas confondre le forum Delphi et la touche F8 de l'EDI Delphi.
Il manque l'allocation mémoire pour ServerName
[edit]
Merci d'éviter le multipost
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Regarde AllocMem et FreeMem.
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!
C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager