Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Frage zu Ordner kopieren (https://www.delphipraxis.net/31529-frage-zu-ordner-kopieren.html)

Christian Seehase 11. Okt 2004 21:04

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.

Henry 20. Okt 2004 01:43

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:

Zitat von SDK for WindowsXP SP2
fFlags
Flags that control the file operation. This member can take a combination of the following flags.
FOF_ALLOWUNDO
Preserve undo information, if possible. Operations can be undone only from the same process that performed the original operation. If pFrom does not contain fully qualified path and file names, this flag is ignored.
FOF_CONFIRMMOUSE
Not used.
FOF_FILESONLY
Perform the operation on files only if a wildcard file name (*.*) is specified.
FOF_MULTIDESTFILES
The pTo member specifies multiple destination files (one for each source file) rather than one directory where all source files are to be deposited.
FOF_NOCONFIRMATION
Respond with "Yes to All" for any dialog box that is displayed.
FOF_NOCONFIRMMKDIR
Do not confirm the creation of a new directory if the operation requires one to be created.
FOF_NO_CONNECTED_ELEMENTS
Version 5.0. Do not move connected files as a group. Only move the specified files.
FOF_NOCOPYSECURITYATTRIBS
Version 4.71. Do not copy the security attributes of the file.
FOF_NOERRORUI
Do not display a user interface if an error occurs.
FOF_NORECURSION
Only operate in the local directory. Don't operate recursively into subdirectories.
FOF_NORECURSEREPARSE
Treat reparse points as objects, not containers. You must set _WIN32_WINNT to 5.01 or later to use this flag. See Shell and Common Controls Versions for further discussion of versioning.
FOF_RENAMEONCOLLISION
Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
FOF_SILENT
Do not display a progress dialog box.
FOF_SIMPLEPROGRESS
Display a progress dialog box but do not show the file names.
FOF_WANTMAPPINGHANDLE
If FOF_RENAMEONCOLLISION is specified and any files were renamed, assign a name mapping object containing their old and new names to the hNameMappings member.
FOF_WANTNUKEWARNING
Version 5.0. Send a warning if a file is being destroyed during a delete operation rather than recycled. This flag partially overrides FOF_NOCONFIRMATION.

Ich bräuchte aber unbedingt eine Möglichkeit ein Verzeichnis mit allen Unterordnern zu kopieren.
Gibt es noch eine Möglichkeit wie man Verzeichnisse kopieren kann?

Danke schon einmal

Henry 16. Nov 2004 19:17

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

Nogge 5. Apr 2005 12:02

Re: Frage zu Ordner kopieren
 
Ich hatte mir mal eine eigene Procedure geschrieben, die bisher bei mir immer funktioniert hat:
Delphi-Quellcode:
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;
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).

sniper_w 5. Apr 2005 12:09

Re: Frage zu Ordner kopieren
 
Zitat:

Wenn ich aus einer Datei in dem zu kopierenden Ordner mit
Delphi-Quellcode:
ComboBox8.Items.LoadFromFile(pfad + dateiname);
die Items lade muß ich dann die Combobox auch mit
Delphi-Quellcode:
ComboBox8.Free
freigeben um den zugriff auf die Datei zu beenden?
Nein.

Christian Seehase 5. Apr 2005 17:12

Re: Frage zu Ordner kopieren
 
Moin Nogge,

Deine Methode hat nur den Nachteil, dass bei CopyFile die Sicherheitsattribute der Dateien nicht mitkopiert werden.

Henry 5. Apr 2005 19:17

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.

Henry 5. Apr 2005 19:29

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

Nogge 5. Apr 2005 21:22

Re: Frage zu Ordner kopieren
 
Ja, das ist auch noch ne Function von mir...sry, dass ich die vergessen habe:
Delphi-Quellcode:
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;
Diese Function braucht die Uses "JclStrings". Kp, ob es bereits einen einfacheren Befehl gibt, aber dieser (=> GetOnlyFolderName) funktioniert auf jeden Fall.

Henry 5. Apr 2005 21:26

Re: Frage zu Ordner kopieren
 
Danke, als nächstes hängt es an DelTree. Ebenfalls nicht in der Hilfe gefunden


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.
Seite 2 von 3     12 3      

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