AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Appdata, Roaming, etc.

Ein Thema von freimatz · begonnen am 4. Apr 2020 · letzter Beitrag vom 25. Apr 2020
Antwort Antwort
Seite 2 von 2     12
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.016 Beiträge
 
Delphi 2009 Professional
 
#11

AW: Appdata, Roaming, etc.

  Alt 17. Apr 2020, 08:01
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.378 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Appdata, Roaming, etc.

  Alt 17. Apr 2020, 08:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#13

AW: Appdata, Roaming, etc.

  Alt 17. Apr 2020, 17:20
Ja, bei mir hat es in %Public% auch Documents, Downloads, Pictures, Videos und so. Aber die Daten meines Programmes passen in keine dieser Kategorien.
Das ist ja in Ordnung. Dann speichere die Daten nicht dort, hab ich ja auch nicht gesagt, dass du das tun solltest . Eher im Gegenteil.

Zitat:
Wenn ich mich dazu gesellen soll verstehe ich das. Aber wieso soll ich etwas in %Public% speichern (so habe ich dich zumindest verstanden) wenn es doch auch sonst fast keiner tut.
Da hast du mich missverstanden, oder ich mich unklar ausgedrückt. Primär bezog ich mich auf die Unterverzeichnisse Documents, Downloads usw., die eben vom Nutzer befüllt werden sollen und nicht von Programmen, denn für letztere gibt es bereits ausreichend Ablageorte (wie eben %ProgramData% und %AppData%).

Grüße
Dalai
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.378 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Appdata, Roaming, etc.

  Alt 18. Apr 2020, 10:46
Ah, ok, Danke.
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Appdata, Roaming, etc.

  Alt 18. Apr 2020, 11:27
Hier mal die Pfade, die wir benutzen:

Delphi-Quellcode:
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}';
und dazu die Initialisierung

Delphi-Quellcode:
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;
und noch ein paar Hilfsroutinen

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;
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.378 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Appdata, Roaming, etc.

  Alt 25. Apr 2020, 09:21
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?
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Appdata, Roaming, etc.

  Alt 25. Apr 2020, 09:52
(Abesehen von der Kleinigkeit warum Du nicht IncludeTrailingPathDelimiter verwendest)
Ja, hatte ich nicht dran gedacht. Ist natürlich besser.

Genau weil andere Routinien decrepated sind, habe ich mich dafür entschieden.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz