![]() |
FileExists funktioniert nicht bei Android?
Hallo
in einem Thread wird eine Datei aus FTP heruntergeladen
Delphi-Quellcode:
erhalte ich folgende Meldung:
procedure TNotificationThread.NetHTTPRequest1RequestCompleted
(const Sender: TObject; const AResponse: IHTTPResponse); var fstream: TFilestream; fn: string; x: boolean; begin fn := TPath.GetSharedDownloadsPath + TPath.DirectorySeparatorChar + 'Test.txt'; x := fileexists(fn); fstream := TFilestream.Create(fn, fmCreate or fmOpenWrite); <--- hier knallt es! AResponse.ContentStream.Position := 0; fstream.CopyFrom(AResponse.ContentStream, AResponse.ContentStream.Size); fstream.DisposeOf; end; Im Projekt test.apk ist eine Exception der Klasse EFCreateError mit der Meldung 'Datei "/storage/emulated/0/Download/test.txt" kann nicht erstellt werden. File exists' aufgetreten. Zur Fehlersuche habe ich x eingebaut, x ist beim Debuggen false und trotzdem soll die Datei in der nächsten Codezeile existieren? Hat jemand einen Tip? Ciao Stefan |
AW: FileExists funktioniert nicht bei Android?
Vielleicht liegt es an fehlende Berechtigungen zum schreiben?
|
AW: FileExists funktioniert nicht bei Android?
In Delphi/Pascal kann man diese Open/Create-Modi garnicht Kombinieren,
das geht nur mit einem optionalen Share-Mode. Es steht so aber auch ganz genau in der Hilfe beschrieben. Zitat:
Ja, in der WinAPI gibt es ein OpenAlways (Öffnen oder Erstellen wenn noch nicht da), aber nicht in Delphi. Entweder du prüfst mit FileExists und nimmst dann fmCreate oder fmOpenWrite oder du nimmst THandleStream mit CreateFile und kannst dort die passende dwCreationDisposition OPEN_ALWAYS verwenden. [add] ![]() [add]
Delphi-Quellcode:
const
OpenMode: array[Boolean] of Word = (fmCreate, fmOpenWrite); var fstream: TFilestream; fn: string; x: boolean; begin fn := TPath.GetSharedDownloadsPath + TPath.DirectorySeparatorChar + 'Test.txt'; x := fileexists(fn); fstream := TFilestream.Create(fn, OpenMode[x]); // oder fstream := TFilestream.Create(fn, IfThen(x, fmOpenWrite, fmCreate)); |
AW: FileExists funktioniert nicht bei Android?
Danke für den Hinweis!
Zitat:
Ciao Stefan |
AW: FileExists funktioniert nicht bei Android?
Zitat:
Delphi-Quellcode:
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.
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 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} |
AW: FileExists funktioniert nicht bei Android?
Zitat:
|
AW: FileExists funktioniert nicht bei Android?
Hallo,
nun habe ich es mit nur
Delphi-Quellcode:
versucht, bekomme aber weiterhin "kann nicht erstellt werden. File exists' aufgetreten."
fstream := TFilestream.Create(fn, fmCreate);
Ciao Stefan |
AW: FileExists funktioniert nicht bei Android?
Schau mal bei KodeZwerg im 2. Beitrag, kann es nicht doch an Berechtigungen liegen ?
Vielleicht mal checken ob das Verzeichnis erreichbar ist. |
AW: FileExists funktioniert nicht bei Android?
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. |
AW: FileExists funktioniert nicht bei Android?
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.
|
AW: FileExists funktioniert nicht bei Android?
Zitat:
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 |
AW: FileExists funktioniert nicht bei Android?
Zitat:
Schau mal hier ![]() 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. |
AW: FileExists funktioniert nicht bei Android?
Das ist halt der Pfad, wo du runtergeladene Dateien lesen kannst.
Selber runterladen und dort speichern ist da nicht inbegriffen ... wobei, ein Webbrowser kann es ja auch, also muß es irgendwie gehn :stupid: Du kannst dir ja mal die APK vom Chrome runterladen und dort nachsehn, was der für Berechtigungen hat. |
AW: FileExists funktioniert nicht bei Android?
Gibt es bei Android nicht so einen Download Manager Service?
|
AW: FileExists funktioniert nicht bei Android?
Zitat:
![]()
Delphi-Quellcode:
Da geht es zwar um eine SD-Karte aber vermutlich ist es das selbe Prinzip, natürlich kann ich mich da auch total irren!
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; |
AW: FileExists funktioniert nicht bei Android?
So, falls jemand die gleichen Probleme bekommt, meine Lösung:
Ich darf nicht direkt unter dem frei zugänglichen Downloads (GetSharedDownloadsPath) Dateien erzeugen, wohl aber Verzeichnisse! Also habe ich dort ein Unterverzeichnis für die App angelegt, darin darf ich Dateien speichern! Somit sind dann die heruntergeladenen Dateien auch vom Benutzer erreichbar, das war das Wichtigste, nicht in die App-Sandbox speichern zu müssen... Ciao Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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