![]() |
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:
Danke für eure Hilfe
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; gruss |
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! |
AW: Fehler beim überschreiben von Datei
Zitat:
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; |
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.
|
AW: Fehler beim überschreiben von Datei
Zitat:
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 |
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. |
AW: Fehler beim überschreiben von Datei
Zitat:
|
AW: Fehler beim überschreiben von Datei
Zitat:
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; |
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. |
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. |
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