![]() |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 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