|
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
|