查找判斷本機是否連有某個網絡盤,或者叫網絡資源連接、網絡驅動器、網盤


文章摘自博文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