![]() |
Problem beim Ermitteln von Verzeichnissen über CSIDL
Hallo,
in MyPC ermittle mit folgender Funktion ein Verzeichnis:
Delphi-Quellcode:
Zudem habe ich ein Array in dem verschiedene CSIDL's enthalten sind. Mein Programm listet diese auf und mit einem Doppelklick kann man diese schnell erreichen. Nun hat aber nicht jedes OS einen bestimmten Ordner, darum muss ich prüfen, ob das Verzeichnis existiert oder nicht. Nun wenn es vorhanden ist, soll es aufgelistet werden. Dies regle ich folgendermaßen:
function TMain.GetShellFolder(const CSIDL: Byte): String;
var PIDL : PItemIdList; Malloc : IMalloc; begin if (SHGetMalloc(Malloc) = S_OK) and (SUCCEEDED(SHGetSpecialFolderLocation(Handle, CSIDL, PIDL))) then try SetLength(Result, MAX_PATH + 1); if (SHGetPathFromIDList(PIDL, PChar(Result))) and (PChar(Result) <> '') then Result := IncludeTrailingPathDelimiter(PChar(Result)) else Result := ''; finally Malloc.Free(pidl); end else Result := ''; end;
Delphi-Quellcode:
Das Problem was hierbei entsteht ist, dass auf manchen Systemen "Geisterverzeichnisse" hinzukommen. Das heißt, eine Leerzeile wird im Programm angezeigt. Wenn man nun darauf einen Doppelklick macht, öffnet sich das Hauptverzeichnis (Root), von dem das Programm gestartet wird (C:\, D:\, etc). Danke an RWarnecke, dem das Phänomen aufgefallen ist. Wenn ein Leerstring zurückgegeben wird, muss doch DirectoryExists False zurückgeben und das Verzeichnis dürft nicht aufgenommen werden.
If DirectoryExists(GetShellFolder(SHELL_CSIDL_DIRS[i])) then
begin SysDirInfo[i].DirName := SHELL_STRING_DIRS[i]; SysDirInfo[i].DirPath := GetShellFolder(SHELL_CSIDL_DIRS[i]); Inc(SysDirCounter); end; Was ist hier falsch? Gruß Mazel |
Re: Problem beim Ermitteln von Verzeichnissen über CSIDL
Zitat:
sieht ein wenig so aus, als ob Du SysDirInfo[i] durch SysDirInfo[SysDirCounter] ersetzen solltest. Besser wäre vielleicht gleich auf eine TList zurückzugreifen. Gruß Der Unwissende |
Re: Problem beim Ermitteln von Verzeichnissen über CSIDL
Zitat:
Wo wird i erhöht und initialisiert ? |
Re: Problem beim Ermitteln von Verzeichnissen über CSIDL
@Der_Unwissende:
Ich habe vorhin vergessen die Variablen anzugeben. I steht für die Schleifenvaraible um auf das entsprechende Element im Array zuzugreifen und nur wenn das Verzeichnis existiert wird SysDirCounter erhöht um in der Anzeige dann nur die die mögliche Anzahl anzuzeigen. @RWarnecke: Meinst du dass DirectoryExists ein Leerstring falsch versteht? Wenn ja müsste er mir auch das Element aus dem Array anzeigen, tut es aber nicht. Also angenommen i = 5 und das Verzeichnis welches ich nachschaue existiert nicht aber DirectoryExists gibt trotzdem True zurück müsste es mir auch das Element 5 im Array anzeigen, aber du weist ja, dass es Leer ist. Ich kann mir nicht erklären was da passiert. |
Re: Problem beim Ermitteln von Verzeichnissen über CSIDL
Zitat:
Versuche es mal so:
Delphi-Quellcode:
If DirectoryExists(GetShellFolder(SHELL_CSIDL_DIRS[i])) then
begin SysDirInfo[SysDirCounter].DirName := SHELL_STRING_DIRS[i]; SysDirInfo[SysDirCounter].DirPath := GetShellFolder(SHELL_CSIDL_DIRS[i]); Inc(SysDirCounter); end; setLength(SysDirInfo, SysDirCounter); |
Re: Problem beim Ermitteln von Verzeichnissen über CSIDL
Das Problem scheint gelöst zu sein. Ich bin mir nicht sicher was nun der Grund war, aber durch verschiedene Lösungen habe ich den Code so geändert dass es jetzt fubktioniert, genaueres kann ich nicht sagen, da ich die Änderungen nicht zurückverfolgen kann.
Danke an alle. :) Gruß Mazel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz