Datei laden un Zeilen zählen
Re: Datei laden un Zeilen zählen
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.
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.
-
- 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
Wo ausgewählt?Nugi89 hat geschrieben:der Dateipfad ist genau der denn ich ausgewählt habe.
Re: Datei laden un Zeilen zählen
ich wähle den Pfad mit OpenDialog aus.
Und dieser steht auch dann bei FileExists(path) drin.
Und dieser steht auch dann bei FileExists(path) drin.
-
- 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
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?
Re: Datei laden un Zeilen zählen
achso nee hatte das so verstanden das ich es mit dem was Windows mitbringt öffnen kann
ein anderes Programm hab ich nicht.

ein anderes Programm hab ich nicht.
-
- 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
Das "was Windows mitbringt" ist ja auch ein Programm. 
Was hast du zum Test verwendet?

Was hast du zum Test verwendet?
Re: Datei laden un Zeilen zählen
ich hab das jetzt so:
Aber jetzt funktioniert etwas mit dem OpenDialog nicht.
bekomme gleich beim start des OpenDialogs eine Exception.
External: SIGSEGV
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;
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.
Re: Datei laden un Zeilen zählen
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.
hab den Dateipfad geladen und mit dem debugger geprüft ob er bei FileExists(path) auch vorhanden war.
-
- 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
Dann probiere einmal diese Textdatei mit dem Windows Programm "Notepad" zu öffnen.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.
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.
-
- 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
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:
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;
-
- 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
Das ist gefährlich, da WideString(FileName) einen transienten Wert liefert dessen Lebensdauer unbestimmt ist.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));
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Datei laden un Zeilen zählen
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:
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;
-
- 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
@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
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) 83-mal heruntergeladen
- kralle
- Lazarusforum e. V.
- Beiträge: 1193
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: Datei laden un Zeilen zählen
Moin,
mal nur so in den Raum gefragt: Könnte es sein das das Dateisystem eine andere Zeichencodierung nutzt als in Lazarus?
Gruß HEiko
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, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
-
- 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
Ok. Wenn man sicher gehen will, kann man ja für den WideString irgendwo eine Variable anlegen.mse hat geschrieben: Das ist gefährlich, da WideString(FileName) einen transienten Wert liefert dessen Lebensdauer unbestimmt ist.
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.