![]() |
Frage zu Ordner kopieren
Hallo,
ich habe ![]()
Delphi-Quellcode:
Wenn ich nun einen Ordner als Quelle angebe der nicht in meinem Programm genutzt wird, dann funktioniert es einwandfrei.
function CopyDir(const fromDir, toDir: string): Boolean;
var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_COPY; fFlags := FOF_FILESONLY; pFrom := PChar(fromDir + #0); pTo := PChar(toDir) end; Result := (0 = ShFileOperation(fos)); end; Nehme ich aber einen Ordner auf den ich mit meinem Programm zugreife, dann bekomme ich die Meldung das die Quelldatei nicht gelesen werden könnte. Ich möchte aber den Ordner sichern und muß ihn somit kopieren wenn das Programm läuft. Ist es denn nicht möglich ein komplettes Verzeichnis zu kopieren wenn auf Dateien zugegriffen wird (es wird nicht geschrieben sondern nur aus Dateien Informationen geladen)? Kann mir da jemand einen Tip geben wo mein Fehler liegt? Danke schon einmal. |
Re: Frage zu Ordner kopieren
Wie hast du denn die dateien in dem Ordner geöffnet? Und warum schließt du sie nicht bevor du sie kopierst? Geöffnete Dateien zu kopieren ist sowieso gefährlich.
|
Re: Frage zu Ordner kopieren
Geöffnet sind sie eigentlich nicht.
Ich lade aus den Dateien beim Programmstart die Items von ein paar Comboboxen. Zu dem Zeitpunkt wo ich die Dateien (bzw. das Verzeichnis) kopieren möchte lade ich aber nichts daraus. Ich wüste nicht das sie noch geöffnet wären. Habe auch gerade mal in die Proceduren gesehen und ich gebe auch eigentlich alles wieder frei. |
Re: Frage zu Ordner kopieren
Wechsel vor dem Kopieren mal das Arbeitsverzeichnis mit
![]() |
Re: Frage zu Ordner kopieren
Auf der Seite habe ich nichts gefunden.
Kenne nur z.B. SetCurrentDir, was ich gerade ohne Erfolg probiert habe. Kannst Du mir das mit SetDirectory mal beschreiben? |
Re: Frage zu Ordner kopieren
Oh, das meinte ich eigentlich: SetCurrentDir.
|
Re: Frage zu Ordner kopieren
Habe da noch einmal eine kleine Erweiterungsfrage zum Freigeben.
Wenn ich aus einer Datei in dem zu kopierenden Ordner mit
Delphi-Quellcode:
die Items lade muß ich dann die Combobox auch mit
ComboBox8.Items.LoadFromFile(pfad + dateiname);
Delphi-Quellcode:
freigeben um den zugriff auf die Datei zu beenden?
ComboBox8.Free
Denn ich habe noch einmal alles durchgesehen und konnte nicht feststellen woran es liegen könnte, das wäre meine einzige Idee. |
Re: Frage zu Ordner kopieren
Mir ist gerade noch etwas aufgefallen.
In dem Code den ich im Forum gefunden habe ist eine Variable fFlags auf FOF_FILESONLY gesetzt. Da in dem Verzeichnis auch ordner sind, kann auch das das Problem sein. Ich habe in der Hilfe danach gesucht, konnte aber leider nichts darüber finden. Wo kann ich denn finden welche Konstanten ich da noch setzen kann? |
Re: Frage zu Ordner kopieren
Moin Henry,
ideal wäre es vermutlich, wenn Du Dir mal das PSDK bei MS herunterladen würdest, aber auch auf MSDN müsstest Du fündig werden können. ![]() |
Re: Frage zu Ordner kopieren
Gibt es die beiden denn auch auf deutsch? Mit Englisch hab ich es nicht so.
|
Re: Frage zu Ordner kopieren
Moin Henry,
nicht dass ich wüsste. Es gab, vor Jahren, mal eine Übersetzung der Win 32 API Doku (drei dicke Bücher), aber die dürfte nicht mal mehr Ansatzweise aktuell sein. |
Re: Frage zu Ordner kopieren
Hallo,
ich habe mir gerade mal in der SDK die möglichen Parameter für fFlags herausgesucht. Leider ist keiner dabei der mir so erscheint das er mein Problem lösen könnte. Zitat:
Gibt es noch eine Möglichkeit wie man Verzeichnisse kopieren kann? Danke schon einmal |
Re: Frage zu Ordner kopieren
Hallo,
ich würde die Frage gern noch einmal aufbringen. Habe bis jetzt leider noch nicht herausfinden können was ich an der Funktion (erster Beitrag) ändern müßte um mein Verzeichnis komplett auf eine Diskette sichern zu können. Vieleicht weis ja doch jemand noch wie man sie anpassen kann. Danke |
Re: Frage zu Ordner kopieren
Ich hatte mir mal eine eigene Procedure geschrieben, die bisher bei mir immer funktioniert hat:
Delphi-Quellcode:
Rekursives Kopieren ist hier bei standardmäßig eingestellt. Wenn du es benutzerdefiniert haben möchtest, musst du bei meinem Kommentar "// true = Recursive" ne Variable einsetzen und diese oben in die Procedure hinzufügen (aber weißte ja sicher).
Procedure CopyDir(DirPath,NewPath: String; Cut:Boolean);
Procedure FindDirs(DirPath: String; StringList:TStrings; Recurse: Boolean = false); var SR:TSearchRec; begin if AnsiLastChar(DirPath)^ <> '\' then DirPath:=DirPath + '\'; // Ordner suchen try if FindFirst(DirPath+'*.*',faDirectory,SR)=0 then repeat if ((SR.Attr and faDirectory)<>0) and (SR.Name <> '.') and (SR.Name <> '..') then begin StringList.Add(DirPath+SR.Name+'\'); if Recurse then FindDirs(DirPath+SR.Name,StringList,true); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; var SR:TSearchRec; i,MainDirIndex:integer; TargetDir: String; List1,List2:TStringList; begin List1:=TStringList.Create; List2:=TStringList.Create; try if AnsiLastChar(DirPath)^ <> '\' then DirPath:=DirPath + '\'; if AnsiLastChar(NewPath)^ <> '\' then NewPath:=NewPath + '\'; List2.Add(DirPath); FindDirs(DirPath,List2,true); // true = Recursive // alle Dateien suchen for i:=0 to List2.Count-1 do if FindFirst(List2.Strings[i]+'*.*',faAnyFile,SR)=0 then try repeat if SR.Attr and faDirectory <> faDirectory then List1.Add(List2.Strings[i]+SR.Name); until FindNext(SR)<>0; finally FindClose(SR); end; // Ordner erstellen for i:=0 to List2.Count-1 do begin TargetDir:=ExtractFilePath(List2.Strings[i]); MainDirIndex:=pos(GetOnlyFolderName(DirPath),TargetDir)-1; delete(TargetDir,1,MainDirIndex); CreateDir(NewPath+TargetDir); end; // Dateien in ihre zugehörigen Ordner kopieren for i:=0 to List1.Count-1 do begin TargetDir:=ExtractFilePath(List1.Strings[i]); MainDirIndex:=pos(GetOnlyFolderName(DirPath),TargetDir)-1; delete(TargetDir,1,MainDirIndex); if copyfile(PChar(List1.Strings[i]),PChar(NewPath+TargetDir+ExtractFileName(List1.Strings[i])),false) then begin if Cut then deletefile(List1.Strings[i]) end else showmessage('Die Datei '+List1.Strings[i]+' konnte nicht kopiert werden !'); end; if Cut then DelTree(DirPath); finally List1.Free; List2.Free; end; end; |
Re: Frage zu Ordner kopieren
Zitat:
|
Re: Frage zu Ordner kopieren
Moin Nogge,
Deine Methode hat nur den Nachteil, dass bei CopyFile die Sicherheitsattribute der Dateien nicht mitkopiert werden. |
Re: Frage zu Ordner kopieren
Danke euch.
ich werde die Procedure bei Gelegenheit mal ausprobieren. In diesem Fall haben die Dateien auch keine Sicherheitsatribute die mit kopiert werden müßten. Ich werde dann hier bekanntgeben ob es funktioniert hat oder nicht. |
Re: Frage zu Ordner kopieren
Müßen für die Procedure noch bestimmte Units eingebunden werden?
Ich bekomme bei GetOnlyFolderName eine Fehlermeldung und in der Hilfe habe ich den Befehl nicht gefunden |
Re: Frage zu Ordner kopieren
Ja, das ist auch noch ne Function von mir...sry, dass ich die vergessen habe:
Delphi-Quellcode:
Diese Function braucht die Uses "JclStrings". Kp, ob es bereits einen einfacheren Befehl gibt, aber dieser (=> GetOnlyFolderName) funktioniert auf jeden Fall.
Function GetOnlyFolderName(Dir: String; PathFolders: Cardinal = 1; SlashAtBack: Boolean = false): String;
var INDEXslash: Integer; BSlash_Count:Cardinal; begin if AnsiLastChar(Dir)^ = '\' then delete(Dir,Length(Dir),1); BSlash_Count:=StrCharCount(Dir,'\'); //JclStrings while BSlash_Count>PathFolders do begin // prüfen, ob mehr als x \ im String vorhanden sind INDEXslash:=pos('\',Dir); // Position des \ bestimmen delete(Dir,INDEXslash,1); // Den \ löschen end; if BSlash_Count<=PathFolders then begin // prüfen, ob genau 1 \ im String vorhanden ist INDEXslash:=pos('\',Dir); // Position des (jetzt nur noch einem einzigen) \ bestimmen delete(Dir,1,INDEXslash); // Den String vom Indexwert 1 bis incl. dem \ löschen end; if SlashAtBack then Dir:=Dir+'\'; result:=Dir; end; |
Re: Frage zu Ordner kopieren
Danke, als nächstes hängt es an DelTree. Ebenfalls nicht in der Hilfe gefunden
|
Re: Frage zu Ordner kopieren
lol, beim nächsten Mal analysiere ich meinen Code genauer^^
DelTree benötigt die Uses "JclFileUtils". Ich hoffe, du hast JCL. |
Re: Frage zu Ordner kopieren
Sagt mir jetzt nichts.
Wenn es bei D6 Prof. standartmäßig dabei ist dann habe ich es, sonst eher nicht ;) |
Re: Frage zu Ordner kopieren
kk, für das bisschen braucht man auch keine neue Klasse:
Delphi-Quellcode:
Und anstatt DelTree kannste auch RmDir schreiben, wie ich gerade sehe, dann brauchste überhaupt keine JCL-Klasse. Wie gesagt, ist lange her, dass ich diese Procedure geschrieben habe^^.
function StrCharCount(const S: AnsiString; C: AnsiChar): Integer;
var I: Integer; begin Result := 0; for I := 1 to Length(S) do if S[I] = C then Inc(Result); end; |
Re: Frage zu Ordner kopieren
wäre es eigentlich auch möglich Dateien im Verzeichnis nach Uhrzeit zu filtern nur bestimme nach einer gewissen Uhrzeit zu kopieren?
:roll: |
Re: Frage zu Ordner kopieren
Ich verstehe deine Frage nicht so ganz. Meinste jetzt das Erstellungsdatum der Datei oder die wirkliche Uhrzeit? Abgesehen davon ist beides möglich, um deine Frage einfach mal ganz simpel zu beanworten^^
|
Re: Frage zu Ordner kopieren
Beides ist schonmal gut,
ich hätte jetzt gern Dateien von Ordner a nach Ordner b kopiert, welche aber mit Erstellungsdatum nach einer gewünschten (Einstellbaren) Uhrzeit liegen. Kann man das gleich in der Shellapi-Funktion FO_COPY oder wie das heißt als Attribut mit reinsetzen??? :firejump: |
Re: Frage zu Ordner kopieren
Wer sucht, der findet:
![]() Dann einfach die Function so z.B. benutzen:
Delphi-Quellcode:
Ein Vergleich zw. der aktuellen Uhrzeit und der gewünschten Zeit würde so aussehen:
procedure TForm1.Button1Click(Sender: TObject);
var ayear,amonth,aday,ahour,amin,asec,amsec:word; begin DecodeDate(GetCreationTimeOfFile(Edit1.Text),ayear,amonth,aday); DecodeTime(GetCreationTimeOfFile(Edit1.Text),ahour,amin,asec,amsec); label1.Caption:=inttostr(ayear)+' '+inttostr(amonth)+' '+inttostr(aday)+#10#13+ inttostr(ahour)+' '+inttostr(amin)+' '+inttostr(asec); { -- leichter, da weniger Code und keine Variablen genutzt werden -- } label1.Caption:=DateToStr(GetCreationTimeOfFile(Edit1.Text))+' '+ TimeToStr(GetCreationTimeOfFile(Edit1.Text)); end;
Delphi-Quellcode:
if TimeToStr(Now) = '13:59:40' then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr. |
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