[DELPHI] TFileStream

Pagina: 1
Acties:
  • 196 views sinds 30-01-2008
  • Reageer

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Wat is er mis met deze code en wat kan er eventueel fout gaan zonder dat een delphi exceptie volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procecure ReadFile(const aName: string);
var
  lFileStream: TFileStream;
begin
  lFileStream := TFileStream.Create(aName, fmOpenRead); //aName is een bestaadn bestand!
  try
  
  (CODE) 

  finally
    lFileStream.Free;
  end;
end;


Dat kan niet mis gaan?Toch wel, bij mij blijft de size van de stream (lFileStream.Size) vrolijk 0, er zit dus niets in!Het bestand bestaat en er volgt GEEN exceptie! Op een andere pc werkt het ook niet...

Eigenaar van domoticavergelijken.info


  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 11-01 23:32

Nvidiot

notepad!

Is alweer een tijd geleden, maar moet je niet iets doen als TFileStream.Open ipv TFileStream.Create ? Zo te zien open je een nieuw bestand met dezelfde naam

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

- Weet je 110% zeker dat het bestand bestaat?
- Klopt de inhoud van de variabele aName
- Weet je zeker dat er geen exceptie optreedt in je try/finnaly block? (het is een instelling of je een zo'n exceptie in je IDE ziet of niet)
- Al door je code heen gestept met F7?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • marenk_vos
  • Registratie: Augustus 2001
  • Laatst online: 23-07 13:21
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.ReadFile(const aName: string);
var bla:integer;
  FileStream: TFileStream;

begin
  FileStream := TFileStream.Create(aName, fmOpenRead); //aName is een bestaadn bestand!
  try

    bla:=FileStream.Size;
    showmessage(inttostr(bla));

  finally
    FileStream.Free;
  end;
end;


Dit werkt bij mij anders prima

Dell XPS 17 Intel i7 2630 Nvidia GT555 3Gb Hd1: OCZ Vertex 2 SSD 60 GB Hd2: 500Gb


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Nvidiot schreef op 22 October 2003 @ 20:47:
Is alweer een tijd geleden, maar moet je niet iets doen als TFileStream.Open ipv TFileStream.Create ? Zo te zien open je een nieuw bestand met dezelfde naam
TFileStream.create is de correcte manier.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:22

Tomatoman

Fulltime prutser

Weet je zeker dat het bestand niet gelockt is door een andere applicatie?

Een goede grap mag vrienden kosten.


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
- 200% zeker dat het bestand bestaat
- Delphi exceptions staat aan
- Bestand is niet locked, vanuit een andere app werkt het wel
- Geen exceptie (200% zeker)

De size is alleen > 0 als ik na het lezen bv. een ShowMessage doe!Domme optimalisatie van de debugger ofzo?

Thxn anyway!

[ Voor 9% gewijzigd door MidnightMotion op 22-10-2003 21:28 ]

Eigenaar van domoticavergelijken.info


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-08 18:56

alienfruit

the alien you never expected

Zet je die optimalisatie toch gewoon (tijdelijk) uit!

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20-08 22:09

Delphi32

Heading for the gates of Eden

Op Windows2000 of XP toevallig? Daar hebben wij dit soort problemen ook wel gehad. Zo te zien kan je door het toevoegen van een Application.ProcessMessages wel de goeie file size achterhalen.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:22

Tomatoman

Fulltime prutser

Je zou ook nog kunnen proberen of het wat uitmaakt als je Position := 0; toevoegt.

Een goede grap mag vrienden kosten.


  • mjax
  • Registratie: September 2000
  • Laatst online: 28-07 20:20
MidnightMotion schreef op 22 oktober 2003 @ 21:27:
- 200% zeker dat het bestand bestaat
- Delphi exceptions staat aan
- Bestand is niet locked, vanuit een andere app werkt het wel
- Geen exceptie (200% zeker)

De size is alleen > 0 als ik na het lezen bv. een ShowMessage doe!Domme optimalisatie van de debugger ofzo?

Thxn anyway!
Als er een exceptie zou zijn, dan zou hij die zien in zijn programma (ook al staan Delphi excepties uit in de debugger). Dit komt door het gebruik van finally t.o.v. except.

Is je nooit opgevallen dat je twee excepties krijgt als je Delphi excepties aan hebt staan in je debugger? Eentje van de debugger en eentje van het programma zelf (door de VCL gegenereerd).

Technische gezien is de eerste exceptie geen exceptie, maar een gewonen melding van de debugger met een messagebox.

[ Voor 8% gewijzigd door mjax op 23-10-2003 07:28 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

mjax schreef op 23 October 2003 @ 07:27:
[...]


Als er een exceptie zou zijn, dan zou hij die zien in zijn programma (ook al staan Delphi excepties uit in de debugger). Dit komt door het gebruik van finally t.o.v. except.

Is je nooit opgevallen dat je twee excepties krijgt als je Delphi excepties aan hebt staan in je debugger? Eentje van de debugger en eentje van het programma zelf (door de VCL gegenereerd).
En de tweede zie je niet met de finally. En de eerste zie je niet met de finally als ook nog eens Delphi Excepties uit staat in de debugger.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20-08 22:09

Delphi32

Heading for the gates of Eden

Creepy schreef op 23 October 2003 @ 08:35:
En de tweede zie je niet met de finally. En de eerste zie je niet met de finally als ook nog eens Delphi Excepties uit staat in de debugger.
Een Try..Finally onderdrukt geen exceptions.
Delphi Exceptions uit in de debugger toont nooit een debug message als er een exception gaat optreden. Hij toont echter altijd een debug message als er een exception optreedt; ongeacht of dit in een try..finally of try..except of asm block plaatsvindt.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Delphi32 schreef op 23 October 2003 @ 09:12:
[...]

Een Try..Finally onderdrukt geen exceptions.
Klopt, my bad.
Delphi Exceptions uit in de debugger toont nooit een debug message als er een exception gaat optreden. Hij toont echter altijd een debug message als er een exception optreedt; ongeacht of dit in een try..finally of try..except of asm block plaatsvindt.
Nu volg ik je niet. Eerst zeg je dat met Delphi Exceptions uit de debugger nooit een debug message toont, en daarna zeg je dat er altijd een debug message wordt gewoont ongeacht of dit in een try...finally of try...except block zit. Of bedoel je in het laatste geval met Delphi Exceptions aan, want dan klopt het :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 13:43
Er wordt altijd een exception getoond. Wanneer het in de ide omgeving gebeurd dan geeft delphi nog een exception met duidelijke omschrijving. Die exception kan je wel normaal uitzetten in de ide :)

De exception die altijd getoond wordt, kan je altijd afvangen met een try .. except. Maar de exception van de debugger blijft wel getoond ondanks de try except behalve weer als die uitgevinkt staat in je debug :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Just_a_Gamer schreef op 23 October 2003 @ 11:27:
Er wordt altijd een exception getoond. Wanneer het in de ide omgeving gebeurd dan geeft delphi nog een exception met duidelijke omschrijving. Die exception kan je wel normaal uitzetten in de ide :)

De exception die altijd getoond wordt, kan je altijd afvangen met een try .. except. Maar de exception van de debugger blijft wel getoond ondanks de try except behalve weer als die uitgevinkt staat in je debug :)
Dan wordt dus niet altijd de exceptie getoond :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
alienfruit schreef op 22 October 2003 @ 21:59:
Zet je die optimalisatie toch gewoon (tijdelijk) uit!
En hoe zet je die uit?
tomatoman schreef op 23 October 2003 @ 01:17:
Je zou ook nog kunnen proberen of het wat uitmaakt als je Position := 0; toevoegt.
Maakt niets uit, Het "probleem" doet zich hier trouwens voor onder 98 maar heb het (volgens mij, dit weet ik niet 100% zeker) ook al gezien onder 2000.

Application.ProcessMessages helpt ook niet, als ik de waarde eerst in een variabele zet is die volgens de debugger wel gevuld terwijl de size van de stream nog steeds 0 lijkt

Eigenaar van domoticavergelijken.info


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 13:43
Project => Options => Tabblad compiler => Checkbox Optimalization uitvinken

Maar ik denk niet dat het daar kan liggen. Je kan het altijd proberen :)

Verwijderd

MidnightMotion schreef op 22 October 2003 @ 20:41:
Wat is er mis met deze code en wat kan er eventueel fout gaan zonder dat een delphi exceptie volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procecure ReadFile(const aName: string);
var
  lFileStream: TFileStream;
begin
  lFileStream := TFileStream.Create(aName, fmOpenRead); //aName is een bestaadn bestand!
  try
  
  (CODE) 

  finally
    lFileStream.Free;
  end;
end;


Dat kan niet mis gaan?Toch wel, bij mij blijft de size van de stream (lFileStream.Size) vrolijk 0, er zit dus niets in!Het bestand bestaat en er volgt GEEN exceptie! Op een andere pc werkt het ook niet...
code:
1
2
3
4
5
6
7
8
9
10
11
12
procecure ReadFile(const aName: string);
var
  lFileStream: TFileStream;
begin
  lFileStream := TFileStream.Create(aName, fmOpenRead or fmShareDenyRead or fmShareDenyWrite);
  try
    lFileStream.Seek(0, soFromEnd);
    ShowMessage(IntToStr(lFileStream.Position));
  finally
    lFileStream.Free;
  end;
end;


Niet getest, dus kan een foutje in zitten...

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Verwijderd schreef op 29 oktober 2003 @ 21:58:
[...]


code:
1
2
3
4
5
6
7
8
9
10
11
12
procecure ReadFile(const aName: string);
var
  lFileStream: TFileStream;
begin
  lFileStream := TFileStream.Create(aName, fmOpenRead or fmShareDenyRead or fmShareDenyWrite);
  try
    lFileStream.Seek(0, soFromEnd);
    ShowMessage(IntToStr(lFileStream.Position));
  finally
    lFileStream.Free;
  end;
end;


Niet getest, dus kan een foutje in zitten...
Das hetzelfde maar op een andere manier, denk niet dat de debugger erin trapt maar kan het nu even niet testen (moet zo weg)
Just_a_Gamer schreef op 29 oktober 2003 @ 19:27:
Project => Options => Tabblad compiler => Checkbox Optimalization uitvinken

Maar ik denk niet dat het daar kan liggen. Je kan het altijd proberen :)
Ligt het inderdaad ook niet aan....

Eigenaar van domoticavergelijken.info


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:22

Tomatoman

Fulltime prutser

Ik zou als waarde voor de Mode parameter fmOpenReadWrite or fmShareDenyNone gebruiken. Als het bestand in aName bestaat voordat je de code aanroept, moet dit absoluut werken.

De volgende code werkt bij mij probleemloos. Maak een tekstbestand aan dat c:\test.txt heet en voer dan de volgende code uit:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var
  FS: TFileStream;
begin
  FS := TFileStream.Create('C:\test.txt', 
    fmOpenReadWrite or fmShareDenyNone);
  try
    FS.Position := 0;
    Memo1.Lines.SaveToStream(FS);
  finally
    FS.Free;
  end;
end;
Nu moet de inhoud van Memo1 zijn opgeslagen in het bestand. Werkt dat bij jou?

Een goede grap mag vrienden kosten.


  • Dala
  • Registratie: November 2000
  • Laatst online: 19-08 10:22
weet je zeker dat het bestand bestaat?

dus:
Delphi:
1
2
3
4
5
6
if FileExists(FileName) then
begin
  {meuk}
end
else
  showmessage('File not Found');

erboven zetten
weet je het zeker.

[ Voor 4% gewijzigd door Dala op 02-11-2003 16:24 ]


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 13:43
Dala schreef op 02 november 2003 @ 16:24:
weet je zeker dat het bestand bestaat?

dus:
Delphi:
1
2
3
4
5
6
if FileExists(FileName) then
begin
  {meuk}
end
else
  showmessage('File not Found');

erboven zetten
weet je het zeker.
Je krijgt een exception als het bestand niet bestaat. Het is wel mooier als je van te voren controleert maar niet de oplossing :)

[ Voor 4% gewijzigd door Just_a_Gamer op 02-11-2003 19:11 ]


  • Dala
  • Registratie: November 2000
  • Laatst online: 19-08 10:22
Just_a_Gamer schreef op 02 november 2003 @ 19:09:
[...]


Je krijgt een exception als het bestand niet bestaat. Het is wel mooier als je van te voren controleert maar niet de oplossing :)
wacht even.. wat hij wil is de execptions disabelen?

is dat niet te doen door de I/O compiler switch te disabelen?

$I+ $I- : enable/disable I/O checking

dus je disabled hem voor het lezen.. en enabled hem weer erna :)

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 13:43
Dala schreef op 02 november 2003 @ 21:35:
[...]

wacht even.. wat hij wil is de execptions disabelen?

is dat niet te doen door de I/O compiler switch te disabelen?

$I+ $I- : enable/disable I/O checking

dus je disabled hem voor het lezen.. en enabled hem weer erna :)
Nop als je een file opent die niet bestaat in TFileStream dan geeft ie een EOpenError exception. De I/O compiler switch die onderdrukt alleen de EInOutError exceptions. :) Maar volgens mij is de probleem van de TS niet de exceptions ;)

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Even voor de duidelijkheid:

Een echt probleem is er niet, ik vraag me alleen af waarom in de debugger de size 0 lijkt terwijl deze wel degelijk een andere waarde heeft (Te zien in een ShowMessage)

Zijn er niet meer mensen met dit "probleem"? Het komt trouwens bij mij voor op een 98 machine, onder 2000 gaat het (bijna?) altijd wel goed.

Eigenaar van domoticavergelijken.info

Pagina: 1