Вверх ↑
Этот топик читают: Гость
Ответов: 79
Рейтинг: 0
#1: 2021-09-28 14:04:09 ЛС | профиль | цитата
Здравствуйте, подскажите пожалуйста, как получить сетевой путь сетевого диска?
Например диск Z: это \\Computer\Folder\example ... Вот последнее и надо.
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4505
Рейтинг: 719
#2: 2021-09-28 14:36:13 ЛС | профиль | цитата
Add(MainForm,2953706,21,105)
{
Height=273
Position=1
}
Add(Button,10504036,217,203)
{
Left=275
Top=20
Width=105
Caption="Network path"
link(onClick,11970995:doGetNetPath,[])
}
Add(InlineCode,11970995,301,203)
{
WorkPoints=#52:doGetNetPath=Получить полный путь для сетевого диска|
EventPoints=#8:onResult|7:onError|
DataPoints=#5:Data1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|29: Windows, KOL, Share, Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|0:|10: public|23: Data1: THI_Event;|26: onResult: THI_Event;|28: onError: THI_Event; |60: procedure doGetNetPath(var _Data: TData; Index: Word);|6: end;|0:|5:const|21: MprDLL = 'mpr.dll';|32: UNIVERSAL_NAME_INFO_LEVEL = 1;|29: REMOTE_NAME_INFO_LEVEL = 2;|0:|0:|4:type|30: UNIVERSAL_NAME_INFO = record|27: lpUniversalName: PChar;|6: end;|43: TUniversalNameInfo = UNIVERSAL_NAME_INFO;|43: PUniversalNameInfo = ^TUniversalNameInfo;|0:|0:|27: REMOTE_NAME_INFO = record|27: lpUniversalName: PChar;|28: lpConnectionName: PChar;|27: lpRemainingPath: PChar;|6: end;|37: TRemoteNameInfo = REMOTE_NAME_INFO;|37: PRemoteNameInfo = ^TRemoteNameInfo;|0:|0:|0:|0:|0:|0:|0:|106:function WNetGetConnection(lpLocalName: PChar; lpRemoteName: PChar; var lpnLength: DWord): DWord; stdcall;|95: external MprDLL name {$ifdef UNICODE}'WNetGetConnectionW'{$else}'WNetGetConnectionA'{$endif};|0:|30:function WNetGetUniversalName(|21: lpLocalName: PChar;|21: dwInfoLevel: DWord;|20: lpBuffer: Pointer;|25: var lpBufferSize: DWord|18:): DWord; stdcall;|101: external MprDLL name {$ifdef UNICODE}'WNetGetUniversalNameW'{$else}'WNetGetUniversalNameA'{$endif};|0:|0:|0:|0:|0:|14:implementation|0:|0:|47:// Сетевой путь из полного пути по компонентах |27:// 'Z:\folder\file.txt' => |41:// - '\\Server\sharename\folder\file.txt'|25:// - '\\Server\sharename'|23:// - '\folder\file.txt'|0:|66:procedure THiAsmClass.doGetNetPath(var _Data: TData; Index: Word);|3:var|12: S: string;|14: R, L: DWord;|16: Buf: Pointer; |5:begin|36: S := ReadString(_Data, Data1, '');|2: |41: L := Length(S) + 1024; // Размер буфера|17: GetMem(Buf, L);|2: |72: R := WNetGetUniversalName(Pointer(S), REMOTE_NAME_INFO_LEVEL, Buf, L);|2: |22: if R = NO_ERROR then|7: begin|65: // TODO: При реализации в компонентах выдать на нижние точки,|32: // либо упаковать в MT-поток|47: S := TRemoteNameInfo(Buf^).lpUniversalName;|29: _hi_OnEvent(onResult, S);|50: //S := TRemoteNameInfo(Buf^).lpConnectionName;|31: //_hi_OnEvent(onResult, S);|49: //S := TRemoteNameInfo(Buf^).lpRemainingPath;|31: //_hi_OnEvent(onResult, S);|5: end|6: else|50: _hi_CreateEvent(_Data, @onError, Integer(R)); |2: |15: FreeMem(Buf);|4:end;|0:|38:// Сетевой путь из полного пути, типа |63:// 'Z:\folder\file.txt' => '\\Server\sharename\folder\file.txt'|68:(*procedure THiAsmClass.doGetNetPath(var _Data: TData; Index: Word);|3:var|12: S: string;|14: R, L: DWord;|16: Buf: Pointer; |5:begin|36: S := ReadString(_Data, Data1, '');|2: |41: L := Length(S) + 1024; // Размер буфера|17: GetMem(Buf, L);|2: |75: R := WNetGetUniversalName(Pointer(S), UNIVERSAL_NAME_INFO_LEVEL, Buf, L);|2: |22: if R = NO_ERROR then|7: begin|50: S := TUniversalNameInfo(Buf^).lpUniversalName;|41: _hi_CreateEvent(_Data, @onResult, S);|5: end|6: else|50: _hi_CreateEvent(_Data, @onError, Integer(R)); |2: |15: FreeMem(Buf);|6:end;*)|0:|0:|2:(*|44:// Сетевой путь только для диска, типа 'Z:' |66:procedure THiAsmClass.doGetNetPath(var _Data: TData; Index: Word);|3:var|12: S: string;|14: R, L: DWord;|33: Path: array [0..1023] of Char; |5:begin|36: S := ReadString(_Data, Data1, '');|2: |50: L := Length(Path); // Размер буфера lpRemoteName|47: R := WNetGetConnection(Pointer(S), @Path, L);|2: |22: if R = NO_ERROR then|7: begin|14: S := Path;|41: _hi_CreateEvent(_Data, @onResult, S);|5: end|6: else|50: _hi_CreateEvent(_Data, @onError, Integer(R)); |2: |33: //_hi_OnEvent(onResult, 'abc');|4:end;|2:*)|0:|0:|0:|0:|4:end.|
link(onResult,15836516:doAdd,[])
link(onError,9344611:doMessage,[])
link(Data1,8100219:Text,[])
}
Add(Edit,8100219,301,140)
{
Left=45
Top=20
Width=220
Text="Z:\folder\file.txt"
}
Add(Label,8593976,21,147)
{
Left=5
Top=25
Width=29
Height=17
Caption="Path:"
}
Add(Message,9344611,357,210)
{
Caption="Ошибка"
Icon=3
}
Add(Memo,15836516,413,203)
{
Left=10
Top=50
Width=365
Height=150
ScrollBars=2
}

Было бы неплохо добавить такой метод в DirTools или Dir.

Редактировалось 1 раз(а), последний 2021-09-29 11:45:00
карма: 26

0
Ответов: 79
Рейтинг: 0
#3: 2021-09-28 14:44:26 ЛС | профиль | цитата
Netspirit, Даж отдельно на Дэлфи пришлось писать... Огромное спасибо дружище, очень выручил!

--- Добавлено в 2021-09-28 14:57:23

Netspirit писал(а):
Было бы неплохо добавить такой метод в DirTools или Dir.

Согласен, ведь мне нужно получить полный сетевой путь к файлу или к папке с этим файлом... Ща сижу думаю, как твою схемку прикрутить...

Пока вроде так получилось:
Add(InlineCode,11970995,532,112)
{
WorkPoints=#52:doGetNetPath=Получить полный путь для сетевого диска|
EventPoints=#8:onResult|7:onError|
DataPoints=#5:Data1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|4:uses|29: Windows, KOL, Share, Debug;|0:|4:type|29: THiAsmClass = class(TDebug)|11: private|0:|10: public|23: Data1: THI_Event;|26: onResult: THI_Event;|28: onError: THI_Event; |60: procedure doGetNetPath(var _Data: TData; Index: Word);|6: end;|0:|0:|106:function WNetGetConnection(lpLocalName: PChar; lpRemoteName: PChar; var lpnLength: DWord): DWord; stdcall;|47: external 'mpr.dll' name 'WNetGetConnectionA';|0:|14:implementation|0:|0:|0:|66:procedure THiAsmClass.doGetNetPath(var _Data: TData; Index: Word);|3:var|12: S: string;|14: R, L: DWord;|33: Path: array [0..1023] of Char; |5:begin|36: S := ReadString(_Data, Data1, '');|2: |50: L := Length(Path); // Размер буфера lpRemoteName|47: R := WNetGetConnection(Pointer(S), @Path, L);|2: |22: if R = NO_ERROR then|7: begin|14: S := Path;|41: _hi_CreateEvent(_Data, @onResult, S);|5: end|6: else|50: _hi_CreateEvent(_Data, @onError, Integer(R)); |2: |33: //_hi_OnEvent(onResult, 'abc');|4:end;|0:|0:|0:|0:|4:end.|
link(onResult,2839362:doString,[])
link(onError,9344611:doMessage,[(585,125)(585,209)])
link(Data1,4340770:Part1,[(538,100)(426,100)(426,163)(377,163)])
}
Add(Edit,8100219,203,105)
{
Left=10
Top=35
Width=670
Text=""
link(onChange,2512878:doCompare,[])
}
Add(Edit,10006956,665,112)
{
Left=10
Top=75
Width=670
Text=""
}
Add(Message,9344611,665,203)
{
Caption="Ошибка"
Icon=3
}
Add(DropFile,15991294,140,105)
{
link(onDropFile,8100219:doText,[])
}
Add(StrMask,2512878,280,105)
{
Mask="*?:*"
link(onFalse,9101286:doWork1,[(648,111)])
link(onTrue,4340770:doSplit,[])
}
Add(MultiStrPart,4340770,371,112)
{
Char="\"
Count=1
link(onSplit,2231758:doValue,[])
}
Add(Memory,2231758,448,112)
{
link(onData,11970995:doGetNetPath,[])
}
Add(FormatStr,2839362,602,112)
{
Mask="%1\%2"
link(onFString,9101286:doWork2,[])
link(Str2,2231758:Value,[(615,100)(575,100)(575,161)(454,161)])
}
Add(HubEx,9101286,644,112)
{
link(onEvent,10006956:doText,[])
}
Add(InfoTip,16131598,266,42)
{
Info=#34:Сетевой диск есть в строке или нет|
Height=109
}


Редактировалось 2 раз(а), последний 2021-09-28 15:09:33
карма: 0

0
Ответов: 4505
Рейтинг: 719
#4: 2021-09-29 11:45:32 ЛС | профиль | цитата
Поправил код - теперь можно подавать целый путь, а не только диск.
карма: 26

0
4
Сообщение
...
Прикрепленные файлы
(файлы не залиты)