Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehler beim überschreiben von Datei (https://www.delphipraxis.net/159755-fehler-beim-ueberschreiben-von-datei.html)

EWeiss 11. Apr 2011 21:49

AW: Fehler beim überschreiben von Datei
 
Delphi-Quellcode:
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

Aphton 11. Apr 2011 22:00

AW: Fehler beim überschreiben von Datei
 
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!

EWeiss 11. Apr 2011 22:03

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von Aphton (Beitrag 1094518)
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;

Luckie 11. Apr 2011 22:04

AW: Fehler beim überschreiben von Datei
 
ich würde da noch eine Fehlerbehandlung einbauen. Sonst wunderst du dich irgendwann warum nichts passiert und suchst dich wieder dumm und dämlich.

EWeiss 11. Apr 2011 22:09

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von Luckie (Beitrag 1094521)
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

sx2008 12. Apr 2011 01:26

AW: Fehler beim überschreiben von Datei
 
Ganz schlimmer Sourcecode. :duck:
Globale Variablen, Funktion die nicht das tun was man erwartet, wirre verkettete Listen,
hart codierte Zahlen anstelle von Konstanten, Speicherlecks, usw.

Aphton 12. Apr 2011 02:19

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von EWeiss (Beitrag 1094520)
Zitat:

Zitat von Aphton (Beitrag 1094518)
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!

Luckie 12. Apr 2011 11:37

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von EWeiss (Beitrag 1094523)
Zitat:

Zitat von Luckie (Beitrag 1094521)
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;

DeddyH 12. Apr 2011 11:44

AW: Fehler beim überschreiben von Datei
 
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.

Luckie 12. Apr 2011 11:45

AW: Fehler beim überschreiben von Datei
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Seite 2 von 5     12 34     Letzte »    

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 by Thomas Breitkreuz