查找判断本机是否连有某个网络盘,或者叫网络资源连接、网络驱动器、网盘


文章摘自博文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会无法匹配到!

调用时的代码如下:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM