Entwickler-Ecke

Dateizugriff - SysUtils.ForceDirectories macht Schreibschutz - wie aufheben


Gerhard_S - So 23.09.12 21:35
Titel: SysUtils.ForceDirectories macht Schreibschutz - wie aufheben
Hallo,
wenn ich den Befehl SysUtils.Forcedirectories('abc/def/ghj') anwende, dann sind alle neu erzeugten Verzeichnisse schreibgeschützt - und meine Delphi-Anwendung verweigert den Zugriff, mit Ansage.
Wie hebe ich den Schreibschutz auf?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 23.09.2012 um 22:09


Gerhard_S - Mo 24.09.12 01:39

Hallo,
ich kann den Fehler einkreisen.
1. nach SysUtils.Forcedirectories('G:\abc\def\ghj') ist es problemlos möglich, per Code eine Datei in das Verzeichnis G:\abc\def\ghj zu schreiben (lokale Operation).
2. Es geht aber um einen Dateitransfer via Indys TIdFTP. Der Get-Befehl von TidFTP verweigert mir den Download in das o.g. Verzeichnis mit der Delphi-Fehlermeldung "Datei 'G:\abc\def\ghj' kann nicht erstellt werden. Zugriff verweigert", wenn ich als remote Source /meins/*.* angebe. Bei /meins/meintest.txt geht es aber.
3. Hier mein Code:

Delphi-Quelltext
1:
2:
if System.SysUtils.ForceDirectories(LocDir+tempstr) then     
IdFTP1.Get(SL[i]+'/*.*', LocDir+tempstr, True, True);

wobei SL[i] ein Verzeichnis auf dem Webserver ist.
Was nun?


mandras - Mo 24.09.12 10:42

Ursache:
Du kannst per FTP nur einzelne Dateien transferieren, ein "*" gibt es nicht.
Abhilfe: vorher in dieses Verzeichnis wechseln, dateien ermitteln und dann für jede einzelne ein Get ausführen.


Gerhard_S - Mo 24.09.12 20:00

Leider geht's auch so nicht.
Ich mache jetzt Folgendes:
- zunächst stelle ich eine lokale Verzeichniskopie her (mit ForceDirectories)
- dann wechsle ich in das entfernte Quellverzeichnis
und dann kommt das, worauf es ankommt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
if IdFTP1.DirectoryListing[j].ItemType = ditFile then
try
IdFTP1.Get(IdFTP1.DirectoryListing[j].FileName, LocDir+tempstr+'\'+IdFTP1.DirectoryListing[j].FileName, True, True);
except
on E:Exception do MessageDlg(E.Message, mtError, [mbOk], 0);
end;
end;

Als Fehlermeldung kommt "No such file". Auf meiner Festplatte landet eine leere Datei. Das verstehe ich nicht. Der erste Parameter von Get ist auf dem Webserver vorhanden, der zweite Parameter soll ja erst erzeugt werden. ForceDirectories erzeugt auf meiner lokalen Festplatte den Verzeichnispfad zur Datei; nach Get ist eine leere Datei mit dem gewünschten Dateinamen vorhanden.


mandras - Mo 24.09.12 20:32

Kann es sein daß es das hier ist?

> IdFTP1.Get(IdFTP1.DirectoryListing[j].FileName, LocDir+tempstr+'\'+IdFTP1.DirectoryListing[j].FileName, True, True);

Weiter oben verwendest Du ja auch '/' für die Server-Seite.


Gerhard_S - Mo 24.09.12 21:56

user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Kann es sein daß es das hier ist?

> IdFTP1.Get(IdFTP1.DirectoryListing[j].FileName, LocDir+tempstr+'\'+IdFTP1.DirectoryListing[j].FileName, True, True);

Weiter oben verwendest Du ja auch '/' für die Server-Seite.

Nach Test: Nein, denn der zweite Parameter hält sich an die lokalen NTFS-Regeln (\ statt /).


mandras - Di 25.09.12 00:09

Entschuldigung, im Eifer des Gefechts habe ich nicht gesehen daß Parameter 2 der Funktion das Ziel angiebt. Insofern ist "\" ja korrekt. Könntest Du evtl. den vollen Code posten dann könnte ich wiederum das mal auf meinen FTP-Server loslassen.


Gerhard_S - So 30.09.12 01:13

Thema hat sich erledigt. Schuld war ein fehlender List-Befehl, so dass die alte Auflistung mit dem neuen Inhalt kollidierte.