Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi E/A Fehler 32 (https://www.delphipraxis.net/171073-e-fehler-32-a.html)

kdrexler 18. Okt 2012 19:47

Delphi-Version: 6

E/A Fehler 32
 
Hallo zusammen,

ich bekomme in der Rutine beim löschen der Datei einen Fehler E/A 32 (Datei wird von einer anderen Anwendung benutz). Habe aber vorher einen einen closefile() eingesetzt. Sieht jemand den Fehler??

Danke für die Hilfe!


Delphi-Quellcode:
procedure artikelnummern_sort;
var zaehler : integer;
Begin
  fartikelimport_neu.CBArtikelsort.Visible := true;
  fartikelimport_neu.CBArtikelsort.Items.Clear;
  assignfile(artikeldatei,stammverzeichnisname + '\' + datenverzeichnisname + '\' + artikeldateiname);
  reset(Artikeldatei);
  while not (eof(Artikeldatei)) do
    Begin
      init_artikel(artikel);
      read(Artikeldatei,artikel);
      str(artikel.typ:1,dummy);
      dummy_zeile := trim(dummy) + '|';
      str(artikel.Artikelnummer:10:0,dummy);
      dummy := '00000000000000000000000000' + trim(dummy);
      dummy := copy(dummy,length(dummy) - 15,length(dummy));
      dummy_zeile := dummy_zeile + trim(dummy) + '|';
      str(artikel.Artikelposition:10,dummy);
      dummy_zeile := dummy_zeile + trim(dummy);
      fartikelimport_neu.CBArtikelsort.Items.Add(dummy_zeile);
    end;
  assignfile(reorg_artikeldatei,stammverzeichnisname + '\' + datenverzeichnisname + '\' + 'S' + artikeldateiname);
  rewrite(reorg_artikeldatei);
  for zaehler := 0 to fartikelimport_neu.CBArtikelsort.Items.Count - 1 do
    Begin
      dummy_zeile := fartikelimport_neu.CBArtikelsort.Items[zaehler];
      init_artikel(artikel);
      dummy := copy(dummy_zeile,1,pos('|',dummy_zeile) - 1);
      val(dummy,artikel.typ,valok);
      dummy_zeile := copy(dummy_zeile,pos('|',dummy_zeile) + 1,length(dummy_zeile));
      dummy := copy(dummy_zeile,1,pos('|',dummy_zeile) - 1);
      val(dummy,artikel.Artikelnummer,valok);
      dummy_zeile := copy(dummy_zeile,pos('|',dummy_zeile) + 1,length(dummy_zeile));
      val(dummy_zeile,artikel.Artikelposition,valok);
      seek(artikeldatei,artikel.Artikelposition - 1);
      init_artikel(artikel);
      read(artikeldatei,artikel);
      artikel.Artikelposition := filesize(reorg_artikeldatei) + 1;
      write(reorg_artikeldatei,artikel);
    end;
  closefile(reorg_artikeldatei);
  close(artikeldatei);
  erase(artikeldatei);    //<== Hier kommt der Fehler!!!
  if DeleteFiles(stammverzeichnisname + '\' + datenverzeichnisname + '\' + artikeldateiname) then
    rename(reorg_artikeldatei,stammverzeichnisname + '\' + datenverzeichnisname + '\' + artikeldateiname);
  fartikelimport_neu.CBArtikelsort.Visible := false;
end;

Uwe Raabe 18. Okt 2012 20:04

AW: E/A Fehler 32
 
So auf Anhieb fällt mir da der Virenscanner ein.

Außerdem: Du benutzt einmal CloseFile und direkt danach Close (ist aber hier wohl nicht die Ursache)
Und: Es gibt zwar ein DeleteFile, aber soweit ich weiß kein DeleteFiles. Tut das nicht dasselbe wie das Erase?

himitsu 18. Okt 2012 20:07

AW: E/A Fehler 32
 
Delphi-Quellcode:
  closefile(reorg_artikeldatei);
  close(artikeldatei)
Sicher daß das Close richtig ist?


Nja, die fehlenden Resourcenschutzblöcke ignorier ich einfach mal und daß man eventuell mit Streams auch nicht schlecht arbeiten würde, wird auch nicht erwähnt und bei deinem binären Format hätte sich TReader/TWriter bestimmt auch nicht schlecht gemacht.

Und warum sind eigentlich die lokal genutzten Dateivariablen global definiert?

[edit]
Das doppelgemoppelte Löschen wurde schon erwähnt.

HiWieGehts 19. Okt 2012 06:31

AW: E/A Fehler 32
 
Hallo,

sollte grundsätzlich funktionieren. Mir ist aber dieses Problem irgendwie bekannt. Kann mich aber nicht mehr genau erinnern. Ich weiß nur noch sicher, dass ich diese Fehlermeldung bekommen habe, wenn ich beim Debugen das Programm vor dem Close beendet habe. Da half nur ein Neustart des Rechners.
Wie bereits zum Teil erwähnt, enthält der Code einige "Besonderheiten":
Close und Closefile: in Delphi6 erlaubt, in Delphi XE3 "Zu viele Parameter" bei Close. Close schließt das Fenster (oder Programm). Sollte auch in Delphi6 für Files nicht mehr verwendet werden.
- erase(artikeldatei);
- If DeleteFiles(stammverzeichnisname + '\' + datenverzeichnisname + '\' + artikeldateiname) then
Diese beiden Zeilen verhindern das Funktionieren des Programms - wenns funktioniert. erase löscht die Datei. DeleteFiles gibt false zurück, wenn die Datei nicht existiert - in diesem Fall also immer der Fall.

himitsu 19. Okt 2012 07:52

AW: E/A Fehler 32
 
Ach ja, und der Fehler 32

Zitat:

ERROR_SHARING_VIOLATION

32 (0x20)

The process cannot access the file because it is being used by another process.
Soll heißen "Kann nicht löschen, weil die Datei irgendwo geöffnet ist".

p80286 19. Okt 2012 09:48

AW: E/A Fehler 32
 
Ich würde "Aufräumen" vorschlagen.
Obwohl formal alles in Ordnung zu sein scheint, behagt mir die externe Definition der Dateien überhaupt nicht. Auch wenn
Delphi-Quellcode:
close
bis D2006 zulässig ist, rate ich da ganz schnell auf die neueren methoden um zu stellen. Denn das ist augenscheinlich ein altes TP-Programm, und aus meiner Erfahrung waren die Dateizugriffedie Schwachstelle bei der Neucompilierung unter Delphi.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz