![]() |
AW: Appdata, Roaming, etc.
ProgramData ist das %Appdata% von Öffentlich, sprich für Sachen, die in keine der Kategorien in Eigene Dokumente passen.
Und wie ich schon schrieb, die allermeisten Programme haben keine für alle Nutzer relevanten Dinge, die sie da reinschreiben können. |
AW: Appdata, Roaming, etc.
Danke ist mir inzwischen klar. Bei meinem Programm dürfte es schon Daten geben die für alle Nutzer relvant sind. Du schriebst von Plugins. So was gibt es auch bei mir. Wenn einer ein neues Plugin einbindet oder ein vorhandenes updated, soll es für alle User gelten (so zu 99% der Konsens.) Das käme dann m.E. in %ProgramData%.
Unklar ist mir nach wie vor die Bedeutung von %Public% (und wo es eine offizielle Doku gibt). Ich vermute, dass in meinem Fall ich mit %AppData% und %ProgramData% auskomme und %Public% nicht benötige. |
AW: Appdata, Roaming, etc.
Zitat:
Zitat:
Grüße Dalai |
AW: Appdata, Roaming, etc.
Ah, ok, Danke. :)
|
AW: Appdata, Roaming, etc.
Hier mal die Pfade, die wir benutzen:
Delphi-Quellcode:
und dazu die Initialisierung
var
CompanyDataPath : string; // Pfad für Programmdateien FEST auf company z.B. C:\ProgramData\CompanyName\ ProgramDataPath : string; // Pfad für Programmdateien z.B. C:\ProgramData\CompanyName\ProgramName\ AppDataRoamingPath : string; // Pfad für Programmdateien-Benutzer (Netzwerk) z.B. C:\Users\Benutzer\AppData\Roaming\CompanyName\ProgramName\ AppDataLocalPath : string; // Pfad für Programmdateien-Benutzer (lokaler PC) z.B. C:\Users\Benutzer\AppData\Local\CompanyName\ProgramName\ DocumentsPath : string; // Pfad für Benutzerdateien z.B. C:\Users\Benutzer\Documents\CompanyName\ProgramName\ TempPath : string; // Pfad für Temp-Ordner z.B. C:\Users\Benutzer\AppData\Local\Temp\ const // https://docs.microsoft.com/de-de/windows/win32/shell/knownfolderid FOLDERID_ProgramData : TGUID = '{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}'; FOLDERID_RoamingAppData : TGUID = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; FOLDERID_LocalAppData : TGUID = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; FOLDERID_Documents : TGUID = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}';
Delphi-Quellcode:
und noch ein paar Hilfsroutinen
function GetFolderPath( folderId: TGUID): string;
var path: LPWSTR; begin if SHGetKnownFolderPath( folderId, KF_FLAG_DEFAULT, 0, path) = S_OK then begin result := path; if copy(result, length(result), 1) <> '\' then result := result + '\'; end else result := ''; end; procedure InitPaths( app: string); begin CompanyDataPath := GetFolderPath( FOLDERID_ProgramData) + company + '\'; ProgramDataPath := GetFolderPath( FOLDERID_ProgramData) + company + '\' + app + '\'; AppDataRoamingPath := GetFolderPath( FOLDERID_RoamingAppData) + company + '\' + app + '\'; AppDataLocalPath := GetFolderPath( FOLDERID_LocalAppData) + company + '\' + app + '\'; DocumentsPath := GetFolderPath( FOLDERID_Documents) + company + '\' + app + '\'; TempPath := TPath.GetTempPath; end;
Delphi-Quellcode:
function IsDirectoryWriteable(const Directory: string): Boolean;
var FileName: String; H: THandle; begin FileName := IncludeTrailingPathDelimiter(Directory) + '_check_write.tmp'; H := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0); Result := H <> INVALID_HANDLE_VALUE; if Result then CloseHandle(H); end; function IsFileReadOnly(const Filename: string): boolean; begin if FileExists(Filename) then begin result := ((GetFileAttributes( PChar(FileName)) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY); if not result then result := not IsDirectoryWriteable( ExtractFilePath( Filename)); end else begin result := false; // damit keine Compilerwarung kommt Exception.Create('File: '+Filename+' does not exists.'); end; end; |
AW: Appdata, Roaming, etc.
Hallo,
Danke. Eigentlich suchte (und fand) ich ja Antworten auf grundlegendere Dinge. Wie man die Pfade abfragt, da habe ich schon etwas und zwar verwende ich eine Methode, die ich vermutlich mal irgendwo kopiert habe. Diese verwendet u.a. SHGetSpecialFolderLocation und SHGetPathFromIDList. Du verwendest SHGetKnownFolderPath. Und heute bin ich noch zufällig auf TPath.GetPublicPath in unit System.IOUtils gestossen. Das verwendet SetLastError und SHGetFolderPath. Nun frage ich mich was die beste Methode ist. Was für mich gegen TPath spricht: 1. Ich finde nichts was CSIDL_APPDATA verwendet - ah doch GetHomePath indirekt 2. Schlampige Umsetzung (DRY) 3. Verwendet SHGetFolderPath was deprecated sein soll So scheint Deine Implementation die bessere zu sein. (Abesehen von der Kleinigkeit warum Du nicht IncludeTrailingPathDelimiter verwendest) Meinungen? |
AW: Appdata, Roaming, etc.
Zitat:
Genau weil andere Routinien decrepated sind, habe ich mich dafür entschieden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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 by Thomas Breitkreuz