AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Fehler beim überschreiben von Datei
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim überschreiben von Datei

Ein Thema von EWeiss · begonnen am 11. Apr 2011 · letzter Beitrag vom 12. Apr 2011
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#11

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 21:49
FOpen(FileName, 2, 4, hFile);
Nein ich wollte die datei mit Zugriffsrechten öffnen.
Das war der einzige Sinn und zweck..

Scheinbar ist mir da ein Denkfehler unterlaufen.

Habe es jetzt so gelößt..

Delphi-Quellcode:
procedure FBuffin(FileName: string);
var
  sBuffer: string;
  f : TextFile;
begin

  if not FExist(FileName) then
    Exit;

  Assignfile(f, FileName);
  reset(f);

  while not eof(f) do
  begin
    ReadLN(f, sBuffer);
    FSeekTo(nReading, sBuffer);
    inc(nReading);
  end;

  CloseFile(f);

end;
Danke für eure Hilfe

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#12

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 22:00
Dieses Snippet ist so nicht sicher...
Was ist, wenn aus welchen Gründen auch immer in der Schleife ein Fehler auftritt? In diesem Fall wird das Filehandle nicht geschlossen, dh. CloseFile(f); wird nicht unbedingt aufgerufen. Im weiteren Programmfluss könnte das zu Bugs führen!
Daher packe das bitte in ein Try-Finally Konstrukt!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 22:03
Dieses Snippet ist so nicht sicher...
Was ist, wenn aus welchen Gründen auch immer in der Schleife ein Fehler auftritt? In diesem Fall wird das Filehandle nicht geschlossen, dh. CloseFile(f); wird nicht unbedingt aufgerufen. Im weiteren Programmfluss könnte das zu Bugs führen!
Daher packe das bitte in ein Try-Finally Konstrukt!
Also für den Fall der Fälle

Meinst so?

Delphi-Quellcode:
procedure FBuffin(FileName: string);
var
  sBuffer: string;
  f : TextFile;
begin

  if not FExist(FileName) then
    Exit;
  try
    Assignfile(f, FileName);
    reset(f);

    while not eof(f) do
    begin
      ReadLN(f, sBuffer);
      FSeekTo(nReading, sBuffer);
      inc(nReading);
    end;
  finally
    CloseFile(f);
  end;

end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 22:04
ich würde da noch eine Fehlerbehandlung einbauen. Sonst wunderst du dich irgendwann warum nichts passiert und suchst dich wieder dumm und dämlich.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 22:09
ich würde da noch eine Fehlerbehandlung einbauen. Sonst wunderst du dich irgendwann warum nichts passiert und suchst dich wieder dumm und dämlich.
Bitte wie sollte die aussehen ..
Ideal wäre auch mit SchreibLeserechtzugriffen.

Weil meine Skin.ini aus dem Programm keinesfalls mit Schreibrechten aufgerufen werden sollte.
Deshalb habe ich auch den kram mit hFile überhaupt eingebaut.

Aber nicht darauf geachtet das die Datei dadurch mehrfach geöffnet wird.

So siehts jetzt aus..
Vielleicht kann es ja jemand brauchen muss halt die Routine für MediaTrackerfile umbauen.

Delphi-Quellcode:
unit uParseTrackerFile;

interface
uses Classes, Windows, uGlobal, SKAeroAPI;

type
  PParseFile = ^TParseFile;
  TParseFile = record
    Nr :Integer;
    Str : string;
    Ptr : PParseFile;
    Max : Integer;
  end;

function FExist(FileSpec : string): Boolean;
procedure FSeekTo(nReading: Integer; sBuffer: string);
function ParsetoMidiTracker(MidiTrackerFile: string;
  ExePath: string; List: TStringList): Boolean;
procedure FBuffin(FileName: string);

implementation
uses uMidiTracker;

var
  LineStart : PParseFile;
  FPBuffer : PParseFile;
  FToPBuffer : PParseFile;
  nReading : Integer;

function ParsetoMidiTracker(MidiTrackerFile: string;
  ExePath: string; List: TStringList): Boolean;
var
  sParse : String;
  IntB: Integer;
  IntA: Integer;

begin

  // Buffer Liste füllen
  FBuffin(MidiTrackerFile);
  if not assigned(FPBuffer) then
  begin
    result := False;
    exit;
  end;

  List.Delimiter := ',';
  FPBuffer := LineStart;
  while (FPBuffer.Nr <= LineStart.Max) do
  begin
    FPBuffer := FPBuffer^.Ptr;
    sParse := LeftTrim(FPBuffer.Str);
    if Length(sParse) <> 0 then
    begin
      List.DelimitedText := sParse;
      // Lade die Noten
      for IntA := 0 to 7 do
      begin
        for IntB := 0 to List.Count - 1 do
          Grid[IntA, IntB] := StrToInt(List.Strings[IntB]);

        inc(FPBuffer.Nr);
        FPBuffer := FPBuffer^.Ptr;
        sParse := LeftTrim(FPBuffer.Str);
        List.DelimitedText := sParse;
        
        for IntB := 0 to List.Count - 1 do
          InstGrid[IntA, IntB] := StrToInt(List.Strings[IntB]);

        inc(FPBuffer.Nr);
        FPBuffer := FPBuffer^.Ptr;
        sParse := LeftTrim(FPBuffer.Str);
        List.DelimitedText := sParse;
      end;

      // Lade das Tempo
      if (FPBuffer.Nr = 16) then
        begin
          for IntB := 0 to List.Count - 1 do
            MidiTracker.Tempo := StrToInt(List.Strings[IntB]);

          SKAERO_SetTrackValue(SKAERO_GetMainItem(MainHandle, ID_TRACK_TEMPO), MidiTracker.Tempo);
          TempoWait := 1000 div round((MidiTracker.Tempo / 15));
        end;
      end;
      if not (FPBuffer.Nr >= LineStart.Max) then
      begin
        inc(FPBuffer.Nr);
        FPBuffer := FPBuffer^.Ptr;
        sParse := LeftTrim(FPBuffer.Str);
        List.DelimitedText := sParse;
      end;

      if (FPBuffer.Nr > 16) then
      begin
        for IntA := 0 to 7 do
        begin
          MidiTracker.CurrentInst[IntA] := StrToInt(List.Strings[IntA]);

        end;
        inc(FPBuffer.Nr);
      end else
      begin
        for IntA := 0 to 7 do
          MidiTracker.CurrentInst[IntA] := InstGrid[IntA, 0];

        inc(FPBuffer.Nr);
      end;

  end;

  // Resourcen Freigeben
  FPBuffer := nil;
  FToPBuffer := nil;
  Result := True;

end;

procedure FBuffin(FileName: string);
var
  sBuffer: string;
  f : TextFile;
begin

  if not FExist(FileName) then
    Exit;
  try
    Assignfile(f, FileName);
    reset(f);

    while not eof(f) do
    begin
      ReadLN(f, sBuffer);
      FSeekTo(nReading, sBuffer);
      inc(nReading);
    end;
  finally
    nReading := 0;
    CloseFile(f);
  end;

end;

function FExist(FileSpec : string): Boolean;
var
  hFile: Cardinal;
  lpFindFileData: TWin32FindData;
begin
  Result := False;
  hFile := FindFirstFile(PAnsiChar(FileSpec), lpFindFileData);
  if hFile <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(hFile);
    Result := True;
  end;
end;

procedure FSeekTo(nReading: Integer; sBuffer: string);
begin

  New(FPBuffer);

  if nReading = 0 then
  Begin
    New(FToPBuffer);
    LineStart := FToPBuffer;
  end;

  FPBuffer^.Nr := nReading;
  FPBuffer^.Str := sBuffer;
  LineStart^.Max := nReading;
  FToPBuffer^.Ptr := FPBuffer;
  FToPBuffer := FPBuffer;

end;

end.

gruss

Geändert von EWeiss (12. Apr 2011 um 00:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#16

AW: Fehler beim überschreiben von Datei

  Alt 12. Apr 2011, 01:26
Ganz schlimmer Sourcecode.
Globale Variablen, Funktion die nicht das tun was man erwartet, wirre verkettete Listen,
hart codierte Zahlen anstelle von Konstanten, Speicherlecks, usw.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#17

AW: Fehler beim überschreiben von Datei

  Alt 12. Apr 2011, 02:19
Dieses Snippet ist so nicht sicher...
Was ist, wenn aus welchen Gründen auch immer in der Schleife ein Fehler auftritt? In diesem Fall wird das Filehandle nicht geschlossen, dh. CloseFile(f); wird nicht unbedingt aufgerufen. Im weiteren Programmfluss könnte das zu Bugs führen!
Daher packe das bitte in ein Try-Finally Konstrukt!
Also für den Fall der Fälle

Meinst so?

Delphi-Quellcode:
procedure FBuffin(FileName: string);
var
  sBuffer: string;
  f : TextFile;
begin

  if not FExist(FileName) then
    Exit;
  try
    Assignfile(f, FileName);
    reset(f);

    while not eof(f) do
    begin
      ReadLN(f, sBuffer);
      FSeekTo(nReading, sBuffer);
      inc(nReading);
    end;
  finally
    CloseFile(f);
  end;

end;
Ähm ich würd Assignfile vorziehen, denn, was ist, wenn z.B. genau dieser Befehl zu Fehler führt? Dann wird CloseFile aufjedenfall noch ausgeführt und das wiederum dürfte zu Fehlern führen, weil es nicht AssignFile nicht richtig ausgeführt werden konnte!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#18

AW: Fehler beim überschreiben von Datei

  Alt 12. Apr 2011, 11:37
ich würde da noch eine Fehlerbehandlung einbauen. Sonst wunderst du dich irgendwann warum nichts passiert und suchst dich wieder dumm und dämlich.
Bitte wie sollte die aussehen ..
So zum Beispiel:
Delphi-Quellcode:
function ReadTextFile(Filename: AnsiString; AccessMode: Integer): AnsiString;
var
  F: TextFile;
  Line: AnsiString;
  FileContent: AnsiString;
begin
  FileMode := AccessMode;
  AssignFile(F, Filename);
  try
    try
      Reset(F);
      while not EOF(F) do
      begin
        Readln(F, Line);
        FileContent := FileContent + Line + #13#10;
      end;
    except
      raise Exception.Create(SysErrorMessage(GetLastError));
    end;
  finally
    CloseFile(F);
  end;
  Result := FileContent;
end;

procedure TForm15.Button1Click(Sender: TObject);
const
  FILENAME = 'D:\Computer\exclude.lst';
var
  s: AnsiString;
begin
  try
    s := ReadTextFile(FILENAME, fmOpenRead);
    ShowMessage(s);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#19

AW: Fehler beim überschreiben von Datei

  Alt 12. Apr 2011, 11:44
Wozu den AccessMode angeben, wenn man eh nur lesen möchte? Und den Filename-Parameter könnte man auch als const deklarieren.

Just my 2 cents.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#20

AW: Fehler beim überschreiben von Datei

  Alt 12. Apr 2011, 11:45
Weil Standard ist Lesen und Schreiben. Und ich habe eben gedacht, wenn man sie mal anders öffnen möchte, dann kann man das so bequem mit angeben. Und mit dem const hast du recht, das vergesse ich immer.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 07:51 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