Pilne: blad 103 przy Reset lub Rewrite

0

Przesladuje mnie blad 103 (File not open) wystepujacy przy Reset lub Rewrite. Bardzo to dziwne, zwazywszy, ze instrukcje te powinny otwierac plik, wiec to, ze nie jest on otwarty, nie powinno bynajmniej stanowic problemu.

Czy kogos to spotkalo i czy wiecie co z tym zrobic?--Pawel

Delphi6

0

Moze plik jest uzywany przez inny program?--Pozdrawiam!
Adam Boduch
www.4programmers.net

0

Może byś podał fragment kodu?
Może źle dałeś AssignFile?--Delphi 6
Pozdrowienia,
Imperior

0

O ile wiem, plik nie jest uzywany przez nic innego. Przykladowy fragment kodu:

AssignFile(F, Name+'.adl');
if FileExists(Name+'.adl') then
Reset(F)
else
Rewrite(F);

(Pada przy Rewrite)

Ten fragment kodu kiedys dzialal, a teraz nie i nie widze sensownego powodu. W innym miejscu padalo mi przy Reset. Przebudowalem program (ot tak, zeby cos zmienic) i pomoglo. A teraz pada przy tym Rewrite.

Aha, gdzies przeczytalem nastepujace rozwiazanie:

{$I-}
Reset(F);
{$I+}
...

Reset{G};

rozwiazanie: jesli Reset F dalo blad zignorowany z powodu $I- i nieodczytany przez IOResult, to przy nastepnej operacji (Reset G) pojawia sie blad 103.
Problem jednak w tym, ze nie uzywam $I, jest defaultowo +...--Pawel

Delphi6

0

Skoro juz chcesz uzywac Reset i Rewrite , to moze
zamiast fileExist lepiej zrobic :
{$I-}
Reset(f);
if IoResult&lt&gt0 then Rewrite(f);

Jesli mozesz to podeslij tresc calej procedurki, bo wydaje mi sie
dziwnym ze "file not open" wystepuje jak mowisz przy Rewerite();

Pozdrawiam
fojcik

0

Dlaczego przez IOResult ma byc lepiej niz przez FileExists?

Procedurke moze podesle, zastanowie sie tylko ktora. jak pisalem bylo to nie raz, w nie jednym miejscu, rowniez przy Reset.

I wlasnie o to chodzi, ze blad 103 przy Reset/Rewrite jest bez sensu!

--Pawel

Delphi6

0

Odwoluje pierwsze pytanie - bylo glupie. Sprobuje przez IOResult--Pawel

Delphi6

0

a czy w tym samym czasie nie wykożystujesz tej samej zmiennej pliku?
może jest jakiś konflikt--Delphi 6
Pozdrowienia,
Imperior

0

Musze to sprawdzic. Wykorzystuje zmienna pliku ktora sie nazywa tak samo ale jest w innej procedurze. Jednak nie calkiem odrebnej, procedura w ktorej wystepuje blad jest zagniezdzona w tamtej procedurze. To moze robic konflikt...--Pawel

Delphi6

0

Nic z tego.

w tej chwili struktura tej czesci programu jest nastepujaca:

procedure TFormImport.ImportSessions(ImportFiles:TDynamicStringArray);
*with nested routines

var
(...)
F : file;
G : TLongSessionFile;
WholeSession: array of TLongSession;
(...)

*nested

function AddLongSession(Session: array of TLongSession; Name :string) : LongInt;

var

FAddLong: file of TLongSession; &lt&lt&lt&lt przedtem bylo F ale zmienilem na unikalna nazwe
i: Integer;

begin
AssignFile(FAddLong, Name+'.adl');
if FileExists(Name+'.adl') then
Reset(FAddLong) &lt&lt&lt jesli plik istnieje, blad jest tu
else
Rewrite(FAddLong); &lt&lt&lt&lttu robi blad 103, ale plik jest otwierany - pojawia sie na dysku
(...)
end;
(...)

begin * of TFormImport.ImportSessions

(...)
AssignFile(F,ATDFiles[i]);
Reset(F,1); &lt&lt&lt OK
(...)
Reset(F,SizeOf(TLongSession)); &lt&lt&ltOK
(zmiana wielkosci rekordu, bez zamykania F, ale to dozwolone. Cytat z Delphi HELP, Reset:
If F is already open, it is first closed and then reopened. )
(...)
SetLength(WholeSession,FileSize(F));

       for j:=0 to Pred(FileSize(F)) do
           BlockRead(F,WholeSession[j], 1);
       CloseFile(F);

(...)
AssignFile(G,Buffer+'.adl');
Reset(G);
(...)
CloseFile(G);
(...)
RecordNo:=AddLongSession(WholeSession, Buffer);
(...)
end; *procedure importsession

Jakies Pomysly? POMOCY!!
--Pawel

Delphi6

0

DZIEKI Imperior !!!!!!!!

Twoj trop byl chyba OK, jednak :))))))))))))--Pawel

Delphi6

0

Z tego co widze to najpierw zakladasz ze plik istnieje, czyli :
AssignFile(G,Buffer+'.adl');
Reset(G);
{bla}
CloseFile(G);
a potem w wywolaniu :
RecordNo:=AddLongSession(WholeSession, Buffer);

funkcja AddLongSession robi sprawdzenie czy plik isnieje. Po co skoro wczesniej zakladasz
ze plik jest sprawdzac jego istnienie ? A moze wlasnie dlatego ze tego sprawdzenia wczesniej nie ma, wywolanie
AssignFile(G,Buffer+'.adl');
Reset(G);
powoduje blad, ktory ze wzgledu na to ze nie jest obsluzony (przy pewnie {I-} ) zglasza sie dopiero przy
kolejnej probie odwolania ?

0

No wlasnie, nie mialem jak zmiescic calego kodu bo by forum peklo :)). Tam tez bylo sprawdzenie czy plik istnieje. To chyba jednak byl jakis konflikt nazwy zmiennej plikowej. Dzieki wszystkim za pomoc!--Pawel

Delphi6

1 użytkowników online, w tym zalogowanych: 0, gości: 1