Programmieren mit C++

Borland C++

32-Bit-Programmierung

Vergleichen von Dateinamen unter Win32

Wie kann man sicher feststellen, ob zwei Dateinamen unter Win32 auf die gleiche Datei im Dateisystem verweisen?

Frage

Das Problem ist gar nicht so trivial, wie es vielleicht auf den ersten Blick aussehen mag. Seit Microsoft UNC Dateinamen unterstützt, kann jede Datei zwei gültige Namen haben: einen kurzen (8+3 Zeichen) sowie einen langen Namen. Ein direkter Vergleich verbietet sich von selbst, da man nicht sicher sein kann, welcher der beiden Namen der kurze und welcher der lange ist. Zudem gibt es keine API-Funktion, die einen langen Dateinamen in einen kurzen konvertiert. Es existieren zwar Beschreibungen, wie man das selbst erledigen kann, aber das ist eine relativ unsichere Vorgehensweise.

Eine sinnvolle Lösung besteht jedoch darin, die PIDLs der Windows 95/NT Shell zu verwenden, denn jede Datei des Dateisystems besitzt eine eindeutige PIDL, so daß die grundlegende Idee darin besteht, nicht die Dateinamen selbst, sondern die PIDLs zu vergleichen.

Lösung

Vorausgesetzt wird, daß die übergebenen Dateinamen pszPath1 und pszPath2 absolute Dateinamen sind.

BOOL CompareFilenames( LPCSTR pszPath1, LPCSTR pszPath2 ) 
{
 VERIFY(pszPath1 != 0);
 VERIFY(pszPath2 != 0);

Der Weg zum ShellFolder-Interface führt über OLE und Multibytestrings.

 CoInitialize(0) ;
 
 BOOL bRet = FALSE;
 
 LPSHELLFOLDER pDesktopFolder;
 
 if( SUCCEEDED( SHGetDesktopFolder(&pDesktopFolder)) ) {
   OLECHAR olePath1[MAX_PATH], olePath2[MAX_PATH];
 
   MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszPath1, -1, 
                       olePath1, MAX_PATH);
   MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszPath2, -1, 
                       olePath2, MAX_PATH);

Anschließend können die beiden PIDL ermittelt...

   LPITEMIDLIST pidl1, pidl2;
   DWORD dwAttr, dummy;
 
   if (SUCCEEDED(pDesktopFolder->ParseDisplayName(0, 0, olePath1, 
                  &dummy, &pidl1, &dwAttr)) &&
       SUCCEEDED(pDesktopFolder->ParseDisplayName(0, 0, olePath2, 
                 &dummy, &pidl2, &dwAttr)) ) {

...und verglichen werden:

Parameter





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 03:30:06 von textarchiv.alojado.de