Problem z BlockWrite I/O Error 1784

0

Witam, czytałem wiele informacji na temat problemu z BlockWrite i błędem I/O Error 1784, lecz w dalszym ciągu nie mogę dojść do przyczyny. Może ktoś mi pomoże?

function TfrmGlowna.ZapiszPlik(sciezka: string): integer;
var
  temp, puste: TPamietaj;
  tempfile: PamietajFile;
  i, c: integer;
begin
  if FileExists(sciezka) then
  begin
    if MessageDlg('Ten plik istnieje! Czy chcesz go nadpisać?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
    begin
      result := 2;
      exit;
    end;
  end;
  OtwartyPath := sciezka;
  INIOtw.WriteString('Dane', 'Plik', sciezka);
  if FileExists(sciezka) then
    DeleteFile(sciezka);
  AssignFile(tempfile, sciezka);
  Rewrite(tempfile);
  c := htlbZdarzenia.Items.Count - 1;
  for i := 0 to c do
  begin
    temp.Nazwa := INInaz.ReadString('Dane', IntToStr(i), '');
    temp.DataUtworzenia := INIdut.ReadDateTime('Dane', IntToStr(i), 0);
    temp.Przez := INIprz.ReadString('Dane', IntToStr(i), '');
    temp.Szczegoly := INIszc.ReadString('Dane', IntToStr(i), '');
    temp.Przypomnienie := INIpzy.ReadDateTime('Dane', IntToStr(i), 0);
    temp.PowtarzanieTN := INIpow.ReadBool('Dane', IntToStr(i), false);
    temp.PowtarzanieMGDMR := INIpom.ReadInteger('Dane', IntToStr(i), 0);
    temp.PowtarzanieIle := INIpoi.ReadInteger('Dane', IntToStr(i), 0);
    temp.PowtarzanieRaz := INIpor.ReadBool('Dane', IntToStr(i), false);
    temp.Akcja := INIakc.ReadInteger('Dane', IntToStr(i), 0);
    temp.DzwiekTN := INIdzw.ReadBool('Dane', IntToStr(i), false);
    temp.DzwiekPath := INIdzp.ReadString('Dane', IntToStr(i), '');
    temp.ApplikacjaTN := INIapp.ReadBool('Dane', IntToStr(i), false);
    temp.ApplikacjaPath := INIapa.ReadString('Dane', IntToStr(i), '');
    temp.ApplikacjaParam := INIapr.ReadString('Dane', IntToStr(i), '');
    temp.DymekTN := INIdym.ReadBool('Dane', IntToStr(i), false);
    temp.DymekIco := INIdyi.ReadInteger('Dane', IntToStr(i), 0);
    temp.DymekTytul := INIdyt.ReadString('Dane', IntToStr(i), '');
    temp.DymekInfo := INIdyn.ReadString('Dane', IntToStr(i), '');
    BlockWrite(tempfile, temp, SizeOf(temp)-1); //miejsce występowania i/o error 1784
    temp := puste;
  end;
  CloseFile(tempfile);
  WyczyscPrawa;
  result := 1;
end;

natomiast definicja TPamietaj:

type
  TPamietaj = packed record
    Nazwa: String[55];
    DataUtworzenia: TDateTime;
    Przez: String[100];
    Szczegoly: String[255];
    Przypomnienie: TDateTime;
    PowtarzanieTN: boolean;
    PowtarzanieMGDMR: integer;
    PowtarzanieIle: integer;
    PowtarzanieRaz: boolean;
    Akcja: integer;
    DzwiekTN: boolean;
    DzwiekPath: String[255];
    ApplikacjaTN: boolean;
    ApplikacjaPath: String[255];
    ApplikacjaParam: String[255];
    DymekTN: boolean;
    DymekIco: integer;
    DymekTytul: String[255];
    DymekInfo: String[255];
  end;

Proszę o pomoc...

1
Rewrite(tempfile, 0);

Spróbuj tak; jeżeli błąd będzie ciągle występował, to ręcznie zapisuj każde pole (oczywiście, korzystamy z Rewrite(tempfile, 0);).

0

Niestety, "Too many actual parameters" na Rewrite(tempfile, 0). Zapomniałem dopisać, że to Delphi 7.

[EDIT]
Ale mam pomysł na inny typ zapisu, dzięki za pomoc.

1

Ech, przeoczyłem fragment w kodzie.
Musisz zamienić to:

tempfile: PamietajFile;

Na to:

tempfile: file;
0

OK, zapis działa dzięki. nie chce zanudzać ale mam teraz problem przy odczycie z pliku w ReadBlock występuje I/O Error 998. Nie mam siły do takiego bawienia się w kotka i myszkę.

var
  temp, puste: TPamietaj;
  tempfile: PamietajFile; // probowałem file i PamietajFile (type file of TPamietaj)
...
AssignFile(tempfile, sciezka);
Reset(tempfile); //w BlockRead i/o error 998
// Reset(tempfile, 0); //EDivByZero
// Reset(tempfile, 1); // w BlockRead Error: Read beyond end of file
...
while not eof(tempfile) do
    begin
      BlockRead(tempfile, temp, SizeOf(temp)); 
...
1

Zapisujesz:

BlockWrite(tempfile, temp, SizeOf(temp)-1);

A odczytujesz:

BlockRead(tempfile, temp, SizeOf(temp)); 
0

No j/w tak robię, ale mam podczas odczytu z BlockRead błąd: "Read beyond end of file" mimo

while not eof(tempfile) do
0
Patryk27 napisał(a)

Zapisujesz:

BlockWrite(tempfile, temp, SizeOf(temp)-1);

A odczytujesz:

BlockRead(tempfile, temp, SizeOf(temp)); 

Miałem taki zapis... ok teraz po dodaniu "-1" wszystko działa. DZIĘKI!

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