Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dateizugriff verweigert bei beliebigen Ordner-Zugriff (https://www.delphipraxis.net/99577-dateizugriff-verweigert-bei-beliebigen-ordner-zugriff.html)

Flummi 14. Sep 2007 09:54


dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Hallo,

ich habe ein großes Problem mit einem Delphi-Programm, dass urplötzlich den Zugriff auf einen Ordner verweigert (Dateizugriff verweigert). Das Programm läuft unter NT und Win XP.

Zum Programm selbst...:
Ein Ausschnitt der "fehlerhaften(?)" Codes bzw. der Prozedur:

Delphi-Quellcode:
procedure TfrmMain.DateiSenden;
const return = chr(13);
var Daten              : Empfaenger;
    SearchRec          : TSearchRec;
    dateiname          : string;
    text               : string[18];
    ASatz              : string;
    FromF, ToF         : file;
    bfile              : textfile;
    NumRead, NumWritten : Integer;
    Buf: array[1..1] of Char;
begin
  // Dateien suchen
  if FindFirst(PfadName+'*.*',faAnyFile,SearchRec)=0 then
    begin
      repeat
        dateiname:=SearchRec.Name;

        // Daten aus der DatenBank holen
        Daten:=DepotSuchen(copy(dateiname,4,3));

        if daten.Name <> 'Unbekannt' then
          begin
            AssignFile(bfile,PfadName+dateiname);
            reset(bfile);
            readln(bfile,ASatz);
            CloseFile(bfile);
            bordero:=copy(ASatz,5,18);

            AssignFile(FromF, PfadName+dateiname);
            Reset(FromF, 1);
            AssignFile(ToF, PfadName+'temp.dat');

            Rewrite(ToF, 1);
            repeat
              BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
              if ord(Buf[1])=10 then
                begin
                  Buf[1]:=chr(13);
                  BlockWrite(ToF,Buf[1],NumRead,NumWritten);
                  Buf[1]:=chr(10);
                  BlockWrite(ToF,Buf[1],NumRead,NumWritten);
                end
              else BlockWrite(ToF, Buf, NumRead, NumWritten);
            until (NumRead = 0);
            CloseFile(FromF);
            CloseFile(ToF);

            DeleteFile(PfadName+dateiname);
            RenameFile(PfadName+'temp.dat',PfadName+dateiname);

            // Datei versenden
            with IdMsgSend do
              begin
                IdMsgSend.MessageParts.Clear;
                TIdAttachment.Create(IdMsgSend.MessageParts,PfadName+dateiname);
                From.Text:=Absender;
                Recipients.EMailAddresses:=daten.EMail;
                Subject:='test';
                SMTP.Connect;
                try
                  SMTP.Send(IdMsgSend);
                finally
                  SMTP.Disconnect;
                end;
              end;

            DeleteFile(PfadName+dateiname);
          end;

      until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
end;
Ich bin mir nicht wirklich sicher, ob das Problem wirklich im Quellcode (bzw. in dieser Prozedur)liegt. Der Pfadname wird per INI-Datei eingelesen. Egal welchen Pfad ich auch nehme, auch ein frisch angelgter Ordner und ein lokaler Zugriff bringt den Fehlercode 5. Kommentiere ich diese Prozedur vom Programmablauf aus, dann gehts...! Auch der DB-Aufruf innerhalb der Prozedur hat KEINEN Einfluss. Kommentiere ich diesen aus, erhalte ich trotzdem den Fehler.
Ich selbst bin kein großer Delphi-Programmierer, verstehe aber die Logik und den Quelltext sehr gut. Entsprechend ist der Code im Original nicht von mir selbt geschrieben. :zwinker:

Vielen Dank schonmal für Eure Hilfe!

f.siebler 14. Sep 2007 10:22

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Moin,
kannst du normal mit dem Explorer auf den Ordner zugreifen?

Flummi 14. Sep 2007 10:33

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Hallo,

ja, der Zugriff über den Explorer ist völlig uneingeschränkt. Das Programm wird unter dem gleichen User ausgeführt wie der Eigentümer/Besitzer des Ordners (Admin).
Auch Änderungen der Ordner-Attribute bringen keine Verbesserung (Stichwort: Schreibschutz)

Das Programm selbst stürzt bei der Fehlermeldung nicht ab.

Vielleicht muss ich dazu noch etwas sagen:

Der Dateipfad, der dem Programm via INI-File zugewiesen wird, wird für diese Prozedur erweitert:

Hier einmal ein Beispiel mit dem Unterordner TEST

Delphi-Quellcode:
PfadName:=INIPfadname+'TEST\';
Der INI-Eintrag für "INIPfadname" lautet z.B. "C:\"

Auf den INIPfadnamen kann beliebig zugegfriffen werden, auch wenn dieser Pfad noch Unterordner enthält. Sobald aber die o.g. Prozedur den Unterordner (Hier "Test\") aufruft, kommt der Fehler "Dateizugriff verweigert". Völlig egal, ob gerade angelegt, mit Dateien gefüllt oder leer...

scrat1979 14. Sep 2007 14:16

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Hallo!!

Laß Dir mal an der Stelle des Fehlers den KOMPLETTEN Dateinamen z.B. mittels Showmessage anzeigen. Evtl. fehlt ja eine Endung und das Programm denkt es handelt sich "nur" um eine Pfadangabe...

SCRaT

Flummi 17. Sep 2007 07:46

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Hallo,

danke für den Tipp, eventuell bin ich einen kleinen Schritt weiter. Ich habe den Anfang der Prozedur wie folgt verändert:

Delphi-Quellcode:
procedure TfrmMain.DateiSenden;
const return = chr(13);
var Daten              : Empfaenger;
    SearchRec          : TSearchRec;
    dateiname          : string;
    text               : string[18];
    ASatz              : string;
    FromF, ToF         : file;
    bfile              : textfile;
    NumRead, NumWritten : Integer;
    Buf: array[1..1] of Char;
begin
  ShowMessage(INIPfadname);
  ShowMessage(PfadName);
  // Dateien suchen
  if FindFirst(PfadName+'*.*',faAnyFile,SearchRec)=0 then
    begin
      repeat
        dateiname:=SearchRec.Name;
        ShowMessage(PfadName+dateiname);
        // Daten aus der DatenBank holen
        Daten:=DepotSuchen(copy(dateiname,4,3));
...
...
...
...
Der INIPfadname und der Pfadname werden richtig ausgegeben. In meinen Test habe ich die Werte:

INIPfadname = D:\Test\
Pfadname = D:\Test\Dateien\

...erhalten. Die Backslashes werden also auch richtig gesetzt.
Die dritte Message macht mich allerdings stutzig :gruebel: :

"D:\Test\Dateien\."

Die Dateinamen bestehen hauptsächlich aus Zahlen, es wird mir aber ein "." (Punkt) zurückgegeben. Das Programm hat jedoch Admin-Rechte bzw. wir unter dem Admin-Account ausgeführt.
Hat jemand eine Idee?

Vielen Dank schonmal...

DeddyH 17. Sep 2007 08:12

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Es wird nicht überprüft, ob es sich um ein Verzeichnis handelt. Das Kopieren geht nur, wenn (SearchRec.Attr and faDirectory) = 0.

Flummi 17. Sep 2007 08:41

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Danke für den Tipp, habe das ganze als IF-Klausel mit eingebaut, das Ergebnis ist jedoch das Gleiche. Die Pfadnamen werden richtig ausgegeben, es kommt dann aber nur ein "." zurück. (Das Verzeichnis ist aber definitv gefüllt!!!)
Die Dateien selbst haben auch keinen Schreibschutz.

DeddyH 17. Sep 2007 08:44

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Das scheint aber nicht funktioniert zu haben. Nach meiner Erfahrung sind die ersten beiden Einträge, die gefunden werden, immer "." für das aktuelle und ".." für das übergeordnete Verzeichnis. Du musst das abfangen, das ist ein altes Ärgernis.

Flummi 17. Sep 2007 09:08

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
:?: So... :?:

Delphi-Quellcode:
procedure TfrmMain.DateiSenden;
const return = chr(13);
var Daten              : Empfaenger;
    SearchRec          : TSearchRec;
    dateiname          : string;
    text               : string[18];
    ASatz              : string;
    FromF, ToF         : file;
    bfile              : textfile;
    NumRead, NumWritten : Integer;
    Buf: array[1..1] of Char;
begin
  ShowMessage(INIPfadname);
  ShowMessage(PfadName);
  // Dateien suchen
  if FindFirst(PfadName+'*.*',faAnyFile,SearchRec)=0 then
   If (SearchRec.Attr And faDirectory = 0) then
    begin
      repeat
        dateiname:=SearchRec.Name;
        ShowMessage(PfadName+dateiname);
        // Daten aus der DatenBank holen
        Daten:=DepotSuchen(copy(dateiname,4,3));
...
...
...
...

messie 17. Sep 2007 09:19

Re: dateizugriff verweigert bei beliebigen Ordner-Zugriff
 
Haben Deine Dateien vielleicht eine einheitliche Extension (z.B. .txt) oder einen anderen einheitlichen Bezeichner? Dann kannst Du im Findfirst und Findnext als Filter *.txt o.ä. einsetzen

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.
Seite 1 von 2  1 2      

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