查找判断本机是否连有某个网络盘,或者叫网络资源连接、网络驱动器、网盘
文章摘自博文https://www.cnblogs.com/dmqhjp/p/14943140.html
delphi自带的用于查找判断对象是否存在的2个函数:FileExists作用于文件,DirectoryExists作用于文件夹。若是用于查找判断本机网盘是否连有某个盘,无论是否连有,前者永远返回false,后者永远返回true。
故想要查找判断本机是否连有某个网络盘,需另写一个函数。
上代码之前首先了解一下后面要用到的GetDriveType函数:
GetDriveType(路径) 是判断一个磁盘驱动器的类型的, 返回一个整数:
0 DRIVE_UNKNOWN 驱动器类型不确定
1 DRIVE_NO_ROOT_DIR 系统目录不存在
2 DRIVE_REMOVABLE 是可移动驱动器
3 DRIVE_FIXED 是固定驱动器
4 DRIVE_REMOTE 是网络驱动器
5 DRIVE_CDROM 是CD-ROM驱动器
6 DRIVE_RAMDISK 是虚拟驱动器
接下来看代码。首先,在本窗体类的private区声明:
然后按Ctrl+shift+C,系统会自动在implementation区创建好实现部分的代码框架,实现部分代码如下:
function TForm1.NetworkDiskExists(DirPath: string): Boolean;
function VolumeID(DriveChar: Char): string;
var
OldErrorMode: Integer;
NotUsed, VolFlags: DWORD;
Buf: array [0..MAX_PATH] of Char;
begin
OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
Buf[0] := #$00;
if GetVolumeInformation(PChar(DriveChar + ':\'), Buf, DWORD(sizeof(Buf)),
nil, NotUsed, VolFlags, nil, 0) then
SetString(Result, Buf, StrLen(Buf))
else Result := '';
if DriveChar < 'a' then
Result := AnsiUpperCaseFileName(Result)
else
Result := AnsiLowerCaseFileName(Result);
Result := Format('[%s]',[Result]);
finally
SetErrorMode(OldErrorMode);
end;
end;
function NetworkVolume(DriveChar: Char): string;
var
Buf: Array [0..MAX_PATH] of Char;
DriveStr: array [0..3] of Char;
BufferSize: DWORD;
begin
BufferSize := sizeof(Buf);
DriveStr[0] := UpCase(DriveChar);
DriveStr[1] := ':';
DriveStr[2] := #0;
//WNetGetConnection:此API函数用于获取网络资源连接名称,即取得它的第1个参数DriveStr所对应的网盘名,并将其赋值给第2个参数Buf。
if WNetGetConnection(DriveStr, Buf, BufferSize) = WN_SUCCESS then //Buf被赋值当前找到的网络盘名称,此时网络盘以一个一个的字符分开存放在数组Buf中(如['\', '\', '1', '9', '2', '.', '1', '6', '8', '.', '2', '.', '2', '8', '\', 'A', 'S', 'H', 'L', 'E', 'Y', #0, #244, #24, #0, '$', #245, #24, #0, '<', #245, #24, #0, #0, #0, #0, #0, #0,,,,,,])。
begin
SetString(Result, Buf, BufferSize);//这里将Buf整理成连贯的网盘名,然后赋给结果Result。(如将上面例子整理成'\\192.168.2.28\ASHLEY'#0'?'#0'$?'#0'<?'#0#0#0#0#0#0#0#0#0'旚'#$18#0#4#0#0#0#0#0'c'#0#0#0#0#0#0,,,,,,')
if DriveChar < 'a' then
Result := AnsiUpperCaseFileName(Result)//将结果Result全部大写再返回
else
Result := AnsiLowerCaseFileName(Result);//将结果Result全部小写再返回
end
else
Result := VolumeID(DriveChar);
end;
var
i:integer;
begin
Result:=False;
for i := 65 to 90 do
begin
if (GetDriveType(Pchar(chr(i)+':\')) =4) then//4代表当前找到的盘是网络驱动器,即网盘。
begin
if Pos(LowerCase(DirPath),LowerCase(NetworkVolume(chr(i))))>0 then//用Pos查找上面返回的字符串Result中是否含有DirPath,若含有则会返回一个大于0的位置整数。
begin
Result:=True;
Break;
end;
end;
end;
end;
然后传参数调用该函数即可。
注意:
参数的形式是:\\ip地址\文件夹名称。如:\\192.168.2.87\TEST, \\192.168.2.28\Ashley。千万不能在文件夹后面再加上“\”,这样Pos会无法匹配到!
调用时的代码如下: