AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

E/A Fehler 32

Offene Frage von "p80286"
Ein Thema von kdrexler · begonnen am 18. Okt 2012 · letzter Beitrag vom 19. Okt 2012
Antwort Antwort
kdrexler

Registriert seit: 12. Mai 2012
3 Beiträge
 
Delphi 6 Professional
 
#1

E/A Fehler 32

  Alt 18. Okt 2012, 20:47
Delphi-Version: 6
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.474 Beiträge
 
Delphi 12 Athens
 
#2

AW: E/A Fehler 32

  Alt 18. Okt 2012, 21:04
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.146 Beiträge
 
Delphi 12 Athens
 
#3

AW: E/A Fehler 32

  Alt 18. Okt 2012, 21:07
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (18. Okt 2012 um 21:11 Uhr)
  Mit Zitat antworten Zitat
HiWieGehts

Registriert seit: 19. Aug 2005
101 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: E/A Fehler 32

  Alt 19. Okt 2012, 07:31
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.
LG, HiWieGehts
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.146 Beiträge
 
Delphi 12 Athens
 
#5

AW: E/A Fehler 32

  Alt 19. Okt 2012, 08:52
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".
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: E/A Fehler 32

  Alt 19. Okt 2012, 10:48
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 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 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