Einzelnen Beitrag anzeigen

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