Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

UNC anstatt Laufwerksbuchstabe

80 views
Skip to first unread message

Manuel Ostertag

unread,
Nov 5, 2003, 7:58:08 AM11/5/03
to
Guten Nachmittag!

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


Wolfgang Enzinger

unread,
Nov 5, 2003, 9:38:44 AM11/5/03
to
Hallo Manuel,

>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

Harald M. Genauck

unread,
Nov 5, 2003, 8:15:06 AM11/5/03
to
Hallo Manuel,

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


Steffen Malmer

unread,
Nov 6, 2003, 2:55:56 AM11/6/03
to
"Manuel Ostertag" <N/o_s.p+a&m*manuel....@de.bosch.com> wrote in message news:<boas51$69t$1...@ns2.fe.internet.bosch.com>...

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!

Manuel Ostertag

unread,
Nov 6, 2003, 6:57:34 AM11/6/03
to

"Steffen Malmer" <m...@wenglor.de> wrote in message
news:ba55632f.0311...@posting.google.com...

> "Manuel Ostertag" <N/o_s.p+a&m*manuel....@de.bosch.com> wrote in
message news:<boas51$69t$1...@ns2.fe.internet.bosch.com>...
> > Guten Nachmittag!
> >
> > 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
>
>

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


Hans

unread,
Nov 6, 2003, 9:28:55 AM11/6/03
to
"Manuel Ostertag" <N/o_s.p+a&m*manuel....@de.bosch.com> wrote in message news:<bodcvh$ji2$1...@ns2.fe.internet.bosch.com>...

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.

0 new messages