AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Probleme mit Dateizugriff nach download/upload

Ein Thema von SimStar001 · begonnen am 19. Mai 2009 · letzter Beitrag vom 20. Mai 2009
Antwort Antwort
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#1

Probleme mit Dateizugriff nach download/upload

  Alt 19. Mai 2009, 18:02
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:
  form1.Livetrack.download(10000);
  form1.Livetrack.refresh(getRealname,GetATCPosition,'EC3');
  form1.Livetrack.upload(10000);
Nun tritt folgendes auf: (allerdings nicht bei meinem Rechner, so dass das ganze nur von Berichten her erklärt werden kann)

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!
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Probleme mit Dateizugriff nach download/upload

  Alt 19. Mai 2009, 20:50
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
42
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Probleme mit Dateizugriff nach download/upload

  Alt 20. Mai 2009, 09:43
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.
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#4

Re: Probleme mit Dateizugriff nach download/upload

  Alt 20. Mai 2009, 12:00
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Probleme mit Dateizugriff nach download/upload

  Alt 20. Mai 2009, 12:11
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?
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#6

Re: Probleme mit Dateizugriff nach download/upload

  Alt 20. Mai 2009, 12:37
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
  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 13:50 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