Netzwerk-Dateien identifizieren/verschiedene Freigabenamen

24/01/2008 - 09:46 von Manfred.FaslerNospam | Report spam
Hallo NG,
manchmal muss man prüfen, ob zwei Dateien gleich sind (Beispiel: gleiche
Dokumentvorlage zweier Dokumente ?).
Dateinamen ein und derselben Datei können sich unterscheiden durch
Groß/Kleinschreibung, durch Angabe von Laufwerksbuchstaben oder UNC Pfad und
auf dem Netzwerk durch verschiedene Freigabenamen.
Die ersten beiden Hürden lassen sich leicht umschiffen, wenn man das
FileSystemObject auswertet.
Weiß jemand, wie man verschiedene Freigabenamen derselben Datei auflösen kann?
Ich verwende W2003.

Ein Beispiel:
Freigabe 1: \\cs1\doku als D: Dateiname D:\winuser\test.doc
Freigabe2: \\cs1\vol1\doku\ als H: Dateiname H:\winuser\test.doc
Je nachdem, auf welchem Weg der Anwender die Datei öffnet, taucht im
aufgelösten UNC Pfad einmal "\vol1" auf und einmal nicht.

Schönen Gruß
Manfred
 

Lesen sie die antworten

#1 Christian Freßdorf
24/01/2008 - 10:24 | Warnen spam
Hallo Manfred,

schau mal, ob folgendes Makro das gewünschte ERgebnis liefert:
Option Explicit

Private Declare Function PathIsUNC Lib "shlwapi.dll" Alias "PathIsUNCA" (ByVal pszPath As String) As Long
Private Declare Function PathIsNetworkPath Lib "shlwapi.dll" Alias "PathIsNetworkPathA" (ByVal pszPath As String) As Long
Private Const RESOURCETYPE_ANY = &H0
Private Const RESOURCE_CONNECTED = &H1
Private Type NETRESOURCE
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As Long
lpRemoteName As Long
lpComment As Long
lpProvider As Long
End Type
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" _
(ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long, _
lpNetResource As Any, lphEnum As Long) As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias _
"WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As Any, _
lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) _
As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal _
lpString As Any) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal _
lpString1 As Any, ByVal lpString2 As Any) As Long
Function LetterToUNC(DriveLetter As String) As String
Dim hEnum As Long
Dim NetInfo(1023) As NETRESOURCE
Dim entries As Long
Dim nStatus As Long
Dim LocalName As String
Dim UNCName As String
Dim i As Long
Dim r As Long
' Begin the enumeration
nStatus = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, _
0&, ByVal 0&, hEnum)
LetterToUNC = DriveLetter
'Check for success from open enum
If ((nStatus = 0) And (hEnum <> 0)) Then
' Set number of entries
entries = 1024
' Enumerate the resource
nStatus = WNetEnumResource(hEnum, entries, NetInfo(0), _
CLng(Len(NetInfo(0))) * 1024)
' Check for success
If nStatus = 0 Then
For i = 0 To entries - 1
' Get the local name
LocalName = ""
If NetInfo(i).lpLocalName <> 0 Then
LocalName = Space(lstrlen(NetInfo(i).lpLocalName) + 1)
r = lstrcpy(LocalName, NetInfo(i).lpLocalName)
End If
' Strip null character from end
If Len(LocalName) <> 0 Then
LocalName = Left(LocalName, (Len(LocalName) - 1))
End If
If UCase$(LocalName) = UCase$(DriveLetter) Then
' Get the remote name
UNCName = ""
If NetInfo(i).lpRemoteName <> 0 Then
UNCName = Space(lstrlen(NetInfo(i).lpRemoteName) + 1)
r = lstrcpy(UNCName, NetInfo(i).lpRemoteName)
End If
' Strip null character from end
If Len(UNCName) <> 0 Then
UNCName = Left(UNCName, (Len(UNCName) - 1))
End If
' Return the UNC path to drive
'added the [] to seperate on printout only
LetterToUNC = UNCName
' Exit the loop
Exit For
End If
Next i
End If
End If
' End enumeration
nStatus = WNetCloseEnum(hEnum)
End Function
Function fkt_GetUNCPath(strFilepath As String, strFileName As String)
If CBool(PathIsNetworkPath(strFilepath)) = True Then
If Dir(strFilepath & "\" & strFileName) = strFileName Then
If Right(strFilepath, 1) = "\" Then
fkt_GetUNCPath = LetterToUNC(Left(strFilepath, 2)) & _
Right(strFilepath, Len(strFilepath) - 2) & strFileName
Else
fkt_GetUNCPath = LetterToUNC(Left(strFilepath, 2)) & _
Right(strFilepath, Len(strFilepath) - 2) & "\" & strFileName
End If
End If
Else
fkt_GetUNCPath = strFilepath & "\" & strFileName
End If
End Function
' Aufruf
Sub ConvertToUNCIfPossible()
' Angaben: "Lw:\Ordner","Dateiname"
MsgBox fkt_GetUNCPath("LW-Pfad>", "<DateiName>")
End Sub

Der Aufruf erfolgt in der "ConvertToUNCIfPossible()" Prozedur.
Angabe ist:
Laufwerkspfad,Dateiname

damit wird aus einem LW der UNC-Pfad ermittelt.

HTH
Christian

Ähnliche fragen