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
Narses: 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
mandras hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!