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

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

调用时的代码如下:

 

posted @ 2021-06-28 10:44  枭二熊  阅读(785)  评论(0编辑  收藏  举报