AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung FileExists funktioniert nicht bei Android?

FileExists funktioniert nicht bei Android?

Ein Thema von skoschke · begonnen am 13. Sep 2022 · letzter Beitrag vom 13. Sep 2022
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.701 Beiträge
 
Delphi 12 Athens
 
#1

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 11:27
So steht das seit zig Jahren in meinem Code so drin und hat bisher immer funktioniert...
Daran kann es auch nicht liegen, denn der Code in TFileStream.Create sieht so aus:
Delphi-Quellcode:
  if (Mode and fmCreate = fmCreate) then
  begin
    LShareMode := Mode and $FF;
    if LShareMode = $FF then
      LShareMode := fmShareExclusive; // For compat in case $FFFF passed as Mode
    inherited Create(FileCreate(AFileName, LShareMode, Rights));
    if FHandle = INVALID_HANDLE_VALUE then
      raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);
  end
Mit fmCreate or fmOpenWrite ergibt sich ein Mode = $FF01. Demnach ist die Bedingung erfüllt und LShareMode wird zu $01. FileCreate ignoriert aber die $01 völlig. Das wird erst relevant, wenn fmExclusive ins Spiel kommt.

OT: Bei solchen Codezeilen in TFileStream.Create frage ich mich immer wieder ob der Entwickler eigentlich versteht was er da schreibt:
Delphi-Quellcode:
{$IFDEF MSWINDOWS}
    inherited Create(FileOpen(AFileName, Mode));
{$ELSE !MSWINDOWS}
                                                                              
    inherited Create(FileOpen(AFileName, Mode));
{$ENDIF MSWINDOWS}
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.188 Beiträge
 
Delphi 12 Athens
 
#2

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 14:15
OT: Bei solchen Codezeilen in TFileStream.Create frage ich mich immer wieder ob der Entwickler eigentlich versteht was er da schreibt:
Delphi-Quellcode:
{$IFDEF MSWINDOWS}
    inherited Create(FileOpen(AFileName, Mode));
{$ELSE !MSWINDOWS}
                                                                              
    inherited Create(FileOpen(AFileName, Mode));
{$ENDIF MSWINDOWS}
Das soll wohl bedeuten dass der Entwickler sehr stark auf Windows fixiert ist und sicherstellen möchte das auch alle anderen Platformen wie Windows behandelt werden sollen
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 14:19
Hallo,

nun habe ich es mit nur

fstream := TFilestream.Create(fn, fmCreate); versucht, bekomme aber weiterhin "kann nicht erstellt werden. File exists' aufgetreten."

Ciao
Stefan
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.188 Beiträge
 
Delphi 12 Athens
 
#4

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 14:23
Schau mal bei KodeZwerg im 2. Beitrag, kann es nicht doch an Berechtigungen liegen ?
Vielleicht mal checken ob das Verzeichnis erreichbar ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#5

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 14:25
Im Windows könnte man GetLastError fragen, warum es nicht geht.

k.A. wie/ob man das im Android machen kann.


fmCreate sollte immer gehen, egal ob Datei da oder nicht,
außer die Schreibrechte fehlen, es ist für's Sharing blockiert oder der Pfad ist ungültig.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.701 Beiträge
 
Delphi 12 Athens
 
#6

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 14:30
Es wäre ja interessant zu wissen, ob die Datei tatsächlich existiert - also nicht nur das Ergebnis von FileExists. Eventuell hilft es dann, diese vorher zu löschen. Zumindest sollte das irgendwelche Zugriffsprobleme offenlegen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 14:41
Zitat:
Schau mal bei KodeZwerg im 2. Beitrag, kann es nicht doch an Berechtigungen liegen ?
Vielleicht mal checken ob das Verzeichnis erreichbar ist.
Volltreffer!
Android 12 zusammen mit meinem aktuellen Delphi 11.2 scheint mir das Schreiben in TPath.GetSharedDownloadsPath zu verbieten!
Dass dann aber die irreführende Meldung "File always exists" kommt ist ja nicht witzig!

Ich muss aber in das allgemeine Downloadverzeichnis schreiben, nur wie stellt man das an, dafür sollte doch das GetSharedDownloadsPath da sein?

Ciao
Stefan
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.188 Beiträge
 
Delphi 12 Athens
 
#8

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 15:02
Ich muss aber in das allgemeine Downloadverzeichnis schreiben, nur wie stellt man das an, dafür sollte doch das GetSharedDownloadsPath da sein?
Das war mal möglich wird aber von Version zu Version von Android immer stärker reglementiert.
Schau mal hier unter "Scoped storage", das ist wohl das was Android noch erlaubt.
Wenn Du Vollzugriff haben willst wirst Du spezielle Berechtigungen abfragen müssen und Google wird Dir beim Review ordentlich auf die Füsse treten, bzw. genau abfragen was Du damit genau machen willst.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: FileExists funktioniert nicht bei Android?

  Alt 13. Sep 2022, 15:52
Zitat:
Schau mal bei KodeZwerg im 2. Beitrag, kann es nicht doch an Berechtigungen liegen ?
Vielleicht mal checken ob das Verzeichnis erreichbar ist.
Volltreffer!
writing-to-an-external-sd-card-in-delphi-10-3-rio

Delphi-Quellcode:
fWriteStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);

...

if PermissionsService.IsPermissionGranted(fWriteStorage) then
begin
  // access previously granted, write files...
end
else
begin
  PermissionsService.RequestPermissions([fWriteStorage],
    procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
    begin
      if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
      begin
        // access granted, write files...
      end
      else
      begin
        // access denied, can't write files...
      end;
    end,
    DisplayRationale);
  end;
end;
Da geht es zwar um eine SD-Karte aber vermutlich ist es das selbe Prinzip, natürlich kann ich mich da auch total irren!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort

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 14:55 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