Ich habe folgendes Problem: In meinem Programm hat der Benutzer an
verschiedenen Stellen die Möglichkeit, Dateien auszuwählen und in sein
"Projekt" einzufügen (hat nichts mit einem VB-Projekt zu tun). Die
Dateiauswahl bzw. allgemein die Ermittelung von Dateinamen und -Pfaden
geschieht über FileLists, DirLists, DriveLists, den CommonDialog und über
OLE-Automation (beispielsweise Methode Model.GetPathName), je nach
Programmroutine.
Die Dateien, mit denen gearbeitet werden, sind über ein Netzwerk verteilt.
Nun habe ich das Problem, dass an Stellen, an denen Dateinamen verglichen
werden müssen, manchmal die UNC verwendet wird (\ \ Server \ Share ) und
manchmal der zugehörige Laufwerksbuchstabe.Dies führt dazu, dass gleiche
Dateinamen als ungleich erkannt werden (c:\test.txt ist ungleich \ \
festplatte0001\ceh\test.txt). Ein Schema, wann welche Form zurückgeliefert
wird, habe ich noch nicht erkennen können.
Nun die Frage: Wie kann ich dieses Problem lösen? Gibt es eine einfache
Funktion, der man z.B. die UNC übergibt, die dann den Laufwerksbuchstaben
zurückliefert?
Vielen Dank im Voraus
Manuel
P.S.: Win 2000prof, VB6
>Die Dateien, mit denen gearbeitet werden, sind über ein Netzwerk verteilt.
>Nun habe ich das Problem, dass an Stellen, an denen Dateinamen verglichen
>werden müssen, manchmal die UNC verwendet wird (\ \ Server \ Share ) und
>manchmal der zugehörige Laufwerksbuchstabe.Dies führt dazu, dass gleiche
>Dateinamen als ungleich erkannt werden (c:\test.txt ist ungleich \ \
>festplatte0001\ceh\test.txt).
es kann noch viel wilder kommen. Angenommen, du hast folgende
Verzeichnisstruktur:
c:
+--Austausch
+--Daten
Austausch ist freigegeben als "sAustausch", Daten als "sDaten". In
Daten liegt eine MeineDatei.txt. Die kann nun angesprochen werden als:
* c:\austausch\daten\MeineDatei.txt
* \\10.20.30.40\sAustausch\Daten\MeineDatei.txt
* \\10.20.30.40\sDaten\MeineDatei.txt
* \\hostname\sAustausch\Daten\MeineDatei.txt
* \\hostname\sDaten\MeineDatei.txt
* c:\austausch\daten\MeineD~1.txt
* \\10.20.30.40\sAustausch\Daten\MeineD~1.txt
* \\10.20.30.40\sDaten\MeineD~1.txt
...
...
Was du im Grunde suchst, ist eine Funktion, mit der untersucht werden
kann, ob zwei Dateipfade auf die *selbe* (nicht: die gleiche!) Datei
zeigen. Mit anderen Worten: gesucht ist die *Identität* einer Datei.
Viel Glück dabei. Ich suche seit Jahren nach einer derartigen
Möglichkeit, hab aber ausser Krücken nichts brauchbares gefunden.
Einmal dachte ich schon, ich wäre mit GetFileInformationByHandle() am
Ziel (siehe
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getfileinformationbyhandle.asp),
die Funktion befüllt eine BY_HANDLE_FILE_INFORMATION-Struktur (siehe
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/by_handle_file_information_str.asp),
dazu steht geschrieben:
"The identifier (low and high parts) and the volume serial number
uniquely identify a file on a single computer. To determine whether
two open handles represent the same file, combine this identifier and
the volume serial number for each file and compare them."
Das klingt super, hat nur einen Nachteil: in ca. der Hälfte der Fälle
bekomme ich für zwei Pfade zu ein und derselben Datei unterschiedliche
IDs ... es funktioniert also schlicht und ergreifend nicht (auch nicht
in reinen Windows-Netzwerken).
Ich behelfe mir zur Zeit mit einer Routine, die verschiedene Krücken
(Dateidatum, Dateigrösse u.v.a.m.) miteinander kombiniert und damit
mit hoher Wahrscheinlichkeit feststellen kann, ob zwei Dateiangaben
identisch sind. Die todsichere Lösung aber scheint es nicht zu geben,
insbesondere dann nicht, wenn in den Zielverzeichnissen nicht
geschrieben werden darf...
Wenn doch jemand eine Lösung hat: Bitte her damit. :-)
--
Viele Grüsse,
Wolfgang
http://www.enzinger.net
Es kann in einem Netzwerk jede Menge Ordnerfreigaben auch ohne zugeordneten
Laufweksbuchstaben geben.... Die Fragestellung müsste daher umgekehrt
lauten...
Viele Grüße
Harald M. Genauck
ABOUT Visual Basic - das Webmagazin
http://www.aboutvb.de
Hallo,
ich habe dir da nen Lösungsvorschlag:
'Benötigte API-Funktion:
Declare Function WNetGetConnection& Lib "mpr.dll" Alias _
"WNetGetConnectionA" (ByVal lpszLocalName As String, _
ByVal lpszRemoteName As String, cbRemoteName As Long)
'Funktion:
Function NetzwerkPfadNachUnc(ByVal Pfadname As String) As String
On Error GoTo Fehlerbehandlung
Dim dummy, UncLaufwerk$, Laufwerk$, Pfad$
Laufwerk = Left(Pfadname, 2)
Pfad = Right(Pfadname, Len(Pfadname) - 2)
If InStr(1, Laufwerk, ":") = 2 Then
UncLaufwerk = String(1001, 0)
dummy = WNetGetConnection(Laufwerk, UncLaufwerk, 1000)
If dummy <> 0 Then UncLaufwerk = Pfadname: GoTo
Fehlerbehandlung
UncLaufwerk = Left(UncLaufwerk, InStr(1, UncLaufwerk, Chr(0))
- 1) & Pfad
Else
UncLaufwerk = Pfadname
End If
Fehlerbehandlung:
NetzwerkPfadNachUnc = UncLaufwerk
End Function
Kopier dir das in ein Modul.
Jetzt musst du nur noch den Pfadnamen übergeben und es kommt
hoffentlich das gewünschte Ergebnis raus.
Hoffe ich konnte dir helfen.
Gruß, Steffen!
Danke für Eure Hinweise, bin jetzt um einiges schlauer.
Hätte nicht gedacht, dass das so ein großes Problem darstellt....
Da in meinem Programm zwei, höchstens drei verschiedener UNCs vorkommen
können, habe ich das jetzt so gelöst, dass ich in die .ini-Datei meines
Programms den zugehörigen Laufwerksbuchstaben eintrage und dann die Pfade
ggf. anhan der .ini-Einträge verändere.
Gruß,
Manuel
Hallo Manuel,
das ist jetzt aber nicht gerade die beste Lösung!!!
Warum nimmst du nicht einfach die Funktion, die dir der Steffen geschrieben hat?!
Die funktioniert einwandfrei und fehlerlos.
Gruß, Hans.