![]() |
Probleme mit Dateizugriff nach download/upload
Hallo,
leider ist mir für mein Problem nicht so recht eine treffende Bezeichnung eingefallen. Also erklär ich mal mein Problem. Ich habe in meiner Klasse folgende Functions:
Delphi-Quellcode:
function TLivetrack.refresh(const RealName : String; const ATC_Position : String; const Tool : String) : boolean;
function datainlist(const TList : TStringlist) : integer; var i : Integer; begin result := -1; if TList.Count = 0 then exit; for i := 0 to TList.Count - 1 do if self.FVID = copy(TList.Strings[i],1,pos(':',TList.strings[i]) - 1) then begin result := i; break; end; end; var TList : Tstringlist; Index : integer; FileName : string; TimeStamp : string; begin result := false; TList := TStringlist.Create; FileName := self.FCacheDirectory + '\' + self.FFileName; try if Fileexists(FileName) then Tlist.LoadFromFile(FileName); Index := datainList(TList); TimeStamp := createTimeStamp; if Index = -1 then TList.add(self.FVID + ':' + TimeStamp + ':' + RealName + ':' + ATC_Position + ':' + Tool) else TList.strings[Index] := self.FVID + ':' + TimeStamp + ':' + RealName + ':' + ATC_Position + ':' + Tool; finally result := true; end; TList.SaveToFile(FileName); TList.Free; end; function TLivetrack.upload(TimeOut : Integer) : boolean; begin result := false; self.FFTP.Port := 21; self.FFTP.Connect(true,TimeOut); if self.FFTPDirectory <> '' then self.FFTP.ChangeDir(self.FFTPDirectory); try self.FFTP.Put(self.FCacheDirectory + '\' + self.FFileName , self.FFileName , false); finally result := true; end; self.FFTP.Disconnect; end; function TLivetrack.download(TimeOut : Integer) : boolean; var FileStream : TFileStream; begin result := false; FileStream := TFileStream.create(self.FCacheDirectory + '\' + self.FFileName,fmcreate); self.FHTTP.Connect(TimeOut); try self.FHTTP.Get(self.FHTTPUrl + '/' + self.FFileName , FileStream); finally result := true; end; FileStream.free; self.FHTTP.Disconnect; end; Diese Functions rufe ich wie folgt auf:
Delphi-Quellcode:
Nun tritt folgendes auf: (allerdings nicht bei meinem Rechner, so dass das ganze nur von Berichten her erklärt werden kann)
form1.Livetrack.download(10000);
form1.Livetrack.refresh(getRealname,GetATCPosition,'EC3'); form1.Livetrack.upload(10000); Erstmals ein Socketfehler 10061, der aber denke ich nichts mit meiner HTTP und FTP Komponente zu tun hat. Es kommt die Fehlermeldung "...data.csv konnte nicht zugegriffen werden, sie wird von einem anderen Prozess verwendet" oder so. Die data.csv wird über die Function downlaod geldaden und in eine Datei gespeichert. Diese wird dann in der Function refresh in eine Liste geladen und verarbeitet un erneut gespeichert. Danach wird sie über uplaod wieder auf den Server geladen. Nun tritt das Problem erst seit kurzem auf , vorwiegend auf Vista. Meine Vermutung wäre, laut Fehlermeldung, dass die Datei nicht so schnell gespeichert werden kann, bevor die nächste Function aufgerufen wird. Könnte das der Fall sein, oder geht das Programm nicht weiter im Quellcode, wenn die Datei nicht richtig gespeichert wurde? Ich finde dies nur merkwürdig, da es auf meinen Rechnern tadellos funktioniert. Wer hat eine Lösung? Desweiteren wäre die Frage, wie man villeicht das "zwischenspeichern" in einer Datei vermeiden könnte, ist ja doch sehr unvorteilhaft. Wenn ich die Datei lade, habe ich sie als Stream da, könnte man diesen so umwandeln un den Inhalt in eine Liste oder ein Array Laden, dann bearbeiten, wieder in eine Liste oder so packen, und dann als diese wieder uploaden oder geht das nicht so einfach!? Vielen Dank für eure Hilfe! |
Re: Probleme mit Dateizugriff nach download/upload
imho bedeutet Socketfehler 10061 "Verbindung abgelehnt". Wenn dass so der Fall ist, dann kann das durchaus von deinen Komponenten generiert werden und der Rest wird als Folgefehler plausibel. Ich würde an deiner Stelle erst mal checken, ob an dem anderen Rechner der Download grundsätzlich klappt bevor ich auf das zwischenspeichern tippe.
Übriegens Zwischenspeichern, nehm einen StringStream und lade die Datei in diesen. Gruß oki |
Re: Probleme mit Dateizugriff nach download/upload
Hallo,
TStringList hat ein LoadFromStream und ein SaveToStream, damit müsstest Du die CSV eigentlich auch direkt als Stringliste aus deinem Stream übernehmen und verarbeiten können. Dann benötigst Du keine Zwischenspeicherung via Datei, sondern "nur noch" ein LoadFromStream und ein SaveToStream. So wie ich es Deinem Quelltext entnehme, sollte das ein gangbarer Weg sein, der mit relativ wenig Änderungen umzusetzen ist, Deinen Funktionen könntest Du den Stream als zusätzlichen Parameter übergeben. |
Re: Probleme mit Dateizugriff nach download/upload
Vielen Dank für die Tips, dann werde ich das ganze per Streams machen.
Jetzt bleibt allerdings nur noch das Problem mit dem Socketfehler 10061. Ich bekam gerade wieder einen Fehlerbericht, wo es hieß das Programm Hänge sich auf, mit dem Fehler Socket Time Out. Also scheint das ganze mit großer Sciherheit an meine eigenen Klasse zu hängen. Gibt es vielleicht beim upload via FTP eine Zugriffsbegrenzung? Weil es versuchen teilweise doch mehrere Leute innerhalb von 5 Minuten auf den Server zu connecten und eine Datei zu hinterlassen. Wird da das ganze vielleicht vom Server her blockíert? Ich übergebe als Timeout 10000ms. Des weiteren erzeuge ich in meiner Klasse ja einfach einen IDFTP und IDHTTP. muss ich denen vielleicht noch irgendwelche bestimten Werte /Eigenschaften zuweisen? |
Re: Probleme mit Dateizugriff nach download/upload
Hallo,
ein Timeout von 10 Sekunden ist nicht unbedingt viel. Zumindest die FTP-Serverkomponente der Indys hat eine Eigenschaft "MaxConnections", da schließe ich jetzt mal draus, dass man FTP-Server entsprechend konfigurieren kann. Werden die Verbindungen zum FTP-Server nach dem Upload... wieder beendet, oder halten die Clients die Verbindung unbegrenzt offen? |
Re: Probleme mit Dateizugriff nach download/upload
Hallo,
also die Verbindung wird sofort nach ausführen der Function beendet, sprich uinr so lange wie nötig offen gehalten. also 10 sekunden halte ich im prinzip schon für ausreichend, wenn man es mit dem Hintergrund betrachtet, das dann das ganze programm hinkt.. Dann werde ich mal nach Max connections schauen und ausprobieren! Danke erstmal! Ich melde mich wieder wenns probleme gibt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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