Datei laden un Zeilen zählen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Datei laden un Zeilen zählen

Beitrag von Nugi89 »

der Dateipfad ist genau der denn ich ausgewählt habe.
Aber es klappt ja soweit alles bis auf das Zählen der Dateizeilen im eigenen Programmordner.

@Michl
deins funktioniert nicht. Kommt immer die Meldung das die Datei nicht geöffnet werden kann.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datei laden un Zeilen zählen

Beitrag von mse »

Nugi89 hat geschrieben:der Dateipfad ist genau der denn ich ausgewählt habe.

Wo ausgewählt?

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Datei laden un Zeilen zählen

Beitrag von Nugi89 »

ich wähle den Pfad mit OpenDialog aus.
Und dieser steht auch dann bei FileExists(path) drin.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datei laden un Zeilen zählen

Beitrag von mse »

Das ist ja auch zu erwarten. Es geht um etwas anderes. Du sagst, dass du die entsprechende Datei mit einem "anderen Programm" öffnen kannst, mit deinem eigenen aber nicht. Die Frage ist, hast du beim "anderen Programm" den exakt gleichen Dateipfad angegeben?

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Datei laden un Zeilen zählen

Beitrag von Nugi89 »

achso nee hatte das so verstanden das ich es mit dem was Windows mitbringt öffnen kann :oops:
ein anderes Programm hab ich nicht.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datei laden un Zeilen zählen

Beitrag von mse »

Das "was Windows mitbringt" ist ja auch ein Programm. ;-)
Was hast du zum Test verwendet?

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Datei laden un Zeilen zählen

Beitrag von Nugi89 »

ich hab das jetzt so:

Code: Alles auswählen

procedure TForm1.Bt_CountClick(Sender: TObject);
var
  anzahl : integer;
  path: string;
  datei: TStringList;
begin
  datei:= TStringList.Create;
  path:= Edit_Path.Text;
 
  if FileExists(path) = true then
  begin
    datei.LoadFromFile(path)
    Edit_Anzahl.Text:= IntToStr(datei.Count);
  end:
  else
  begin
    showMessage('nicht vorhanden!')
  end;
end;
 
 
procedure TForm1.Edit_PathClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Edit_Path.Text:= OpenDialog1.FileName;
  end;
end;


Aber jetzt funktioniert etwas mit dem OpenDialog nicht.
bekomme gleich beim start des OpenDialogs eine Exception.
External: SIGSEGV
Zuletzt geändert von Nugi89 am Mo 14. Sep 2015, 16:25, insgesamt 1-mal geändert.

Nugi89
Beiträge: 68
Registriert: Do 26. Feb 2015, 13:46

Re: Datei laden un Zeilen zählen

Beitrag von Nugi89 »

Zum Testen hab ich eine Textdatei benutzt.
hab den Dateipfad geladen und mit dem debugger geprüft ob er bei FileExists(path) auch vorhanden war.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datei laden un Zeilen zählen

Beitrag von mse »

Nugi89 hat geschrieben:Zum Testen hab ich eine Textdatei benutzt.
hab den Dateipfad geladen und mit dem debugger geprüft ob er bei FileExists(path) auch vorhanden war.

Dann probiere einmal diese Textdatei mit dem Windows Programm "Notepad" zu öffnen.
Zur Erinnerung:
TBug hat geschrieben:Kannst Du diese Datei mit einem anderen Programm (z.B Editor) öffnen?

Nugi89 hat geschrieben:Und ja ich kann die Datei mit einem anderen Programm öffnen.

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Datei laden un Zeilen zählen

Beitrag von Patito »

Im Konkreten Fall hier kann ich gerade nicht weiterhelfen, (sieht aus als wäre da am System etwas kaputt...).

Falls aber sonst jemand ein Test-File haben will, bei dem auch ich Probleme
mit OpenFileDialog bekomme, hätte ich folgenden anzubieten:

Code: Alles auswählen

 
procedure ProblematischesFileErstellen;
var Handle: Integer;
  FileName: String;
  Buffer: array [0..1024] of Byte;
  FileNameWide_Start: PWideChar;
  Dest: PWideChar;
  i: Integer;
  Cursor: PByte;
begin
  FileName := '\\?\C:\Test\Test1.txt';   // <--- Gewünschtes Ausgabeverzeichnis hier einstellen
 
  for i := Low(Buffer) to High(Buffer) do
    Buffer[i] := 0;
 
  FileNameWide_Start := PWideChar(WideString(FileName));
  Dest := @Buffer;
 
  Move(FileNameWide_Start^, Dest^, Length(FileName) * 2);
 
  FileNameWide_Start := @Buffer[0];
 
  Cursor := PByte(FileNameWide_Start);
  Inc(Cursor, Length(FileName) * 2);
  Cursor^ := $D8;
  Inc(Cursor);
  Cursor^ := $00;
  Inc(Cursor);
  Cursor^ := $FF;
  Inc(Cursor);
  Cursor^ := $FF;
 
  //Cursor^ := $D8;  // falls man noch mehr testen will...
  //Inc(Cursor);
  //Cursor^ := $01;
  //Inc(Cursor);
  //Cursor^ := $CC;
  //Inc(Cursor);
  //Cursor^ := $CC;
  //
  //Inc(Cursor);
  //Cursor^ := $DB;
  //Inc(Cursor);
  //Cursor^ := $FF;
  //Inc(Cursor);
  //Cursor^ := $01;
  //Inc(Cursor);
  //Cursor^ := $02;
  //
  //Inc(Cursor);
  //Cursor^ := $DF;
  //Inc(Cursor);
  //Cursor^ := $FF;
  //Inc(Cursor);
  //Cursor^ := $22;
  //Inc(Cursor);
  //Cursor^ := $FF;
 
  Handle := Windows.CreateFileW(FileNameWide_Start, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
 
  if (Handle >= 0) then
    FileClose(Handle)
  else
    ShowMessage(IntToStr(GetLastError));
end;
 
 

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Datei laden un Zeilen zählen

Beitrag von mse »

Patito hat geschrieben:

Code: Alles auswählen

 
procedure ProblematischesFileErstellen;
var Handle: Integer;
  FileName: String;
  Buffer: array [0..1024] of Byte;
  FileNameWide_Start: PWideChar;
  Dest: PWideChar;
  i: Integer;
  Cursor: PByte;
begin
  FileName := '\\?\C:\Test\Test1.txt';   // <--- Gewünschtes Ausgabeverzeichnis hier einstellen
 
  for i := Low(Buffer) to High(Buffer) do
    Buffer[i] := 0;
 
  FileNameWide_Start := PWideChar(WideString(FileName));
 

Das ist gefährlich, da WideString(FileName) einen transienten Wert liefert dessen Lebensdauer unbestimmt ist.

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Datei laden un Zeilen zählen

Beitrag von Warf »

Nun wie groß ist die Datei, wenn du versuchst in eine StringList bei einem 32 Bit Programm mehr als 3 GB zu lesen wird es krachen.

Ich würde Prinzipiell wenn es nur um das Zählen der Zeilen geht die Datei nicht komplett einlesen, versuch mal so etwas, hier hast du auch besser in überblick wo es kracht:

Code: Alles auswählen

function CountLines(FileName: String): SizeInt;
var f: TextFile;
  s: String;
begin
  result:=0;
  AssignFile(f, FileName);
  try
    reset(f);
    while not EOF(f) do
    begin
      ReadLn(f, s);
      inc(result);
    end;
  finally
    CloseFile(f);
  end;
end;

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Datei laden un Zeilen zählen

Beitrag von TBug »

@Nugi89

Probiere einmal den Code bzw. die Exe im Anhang aus und berichte ob dies bei Dir funktioniert.

Im Anhang:
komplettes Projekt mit Projektdateien und SourcCode
Kompilierte Exe mit Lazarus 1.4.2
2 Textdateien zum aufrufen
Dateianhänge
OpenDialog.zip
Source und Exe
(3.93 MiB) 64-mal heruntergeladen

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Datei laden un Zeilen zählen

Beitrag von kralle »

Moin,

mal nur so in den Raum gefragt: Könnte es sein das das Dateisystem eine andere Zeichencodierung nutzt als in Lazarus?

Gruß HEiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Datei laden un Zeilen zählen

Beitrag von Patito »

mse hat geschrieben:Das ist gefährlich, da WideString(FileName) einen transienten Wert liefert dessen Lebensdauer unbestimmt ist.


Ok. Wenn man sicher gehen will, kann man ja für den WideString irgendwo eine Variable anlegen.
Im Debugger sehe ich erst am Ende der Prozedur ein fpc_widestr_decr_ref, daher ist das zumindest bei mir mit dem 2.6.4 Compiler ok.

Da der Code problematische Bytes in den Filenamen schreiben soll, habe ich auf sowas gar nicht erst geachtet.

Antworten