![]() |
Kann man auch Ordner kopieren???
Hallo!
Man kann ja mit CopyFile() Dateien kopieren, gibts denn auch etwas, womit man Ordner kopieren kann??? Max |
Re: Kann man auch Ordner kopieren???
|
Re: Kann man auch Ordner kopieren???
Vielleicht ist das(
![]() |
Re: Kann man auch Ordner kopieren???
Hat irgendjemand denn noch ne Lösung für mein Problem?
|
Re: Kann man auch Ordner kopieren???
Schau dir doch Sakura's Link an! :twisted:
|
Re: Kann man auch Ordner kopieren???
So, ich habe das Problem mal ergänzt und einen weiteren Beitrag angehangen, der sollte helfen ;-)
![]() ...:cat:... |
Re: Kann man auch Ordner kopieren???
So ich hab jetzt mal ein Code erstellt, aber mit dem kopieren klappts immer noch nicht!!
Code:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ShellApi; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var FromPath, ToPath: WideString; SHFileOpStruct: TSHFileOpStruct; aOperation: FILEOP_FLAGS; aFrom, aTo: AnsiString; Flags: FILEOP_FLAGS; begin FromPath := 'c:\asd.jpg'#0#0; ToPath := 'e:\asd.jpg'#0#0; with SHFileOpStruct do begin Wnd := 0; wFunc := aOperation; pFrom := PAnsiChar(FromPath); if ToPath <> '' then begin pTo := PAnsiChar(ToPath) end else begin // target available pTo := nil; end; // target not available fFlags := Flags; end; // structure end; end. Max |
Re: Kann man auch Ordner kopieren???
Da fehlt die letzte, aber alles entscheidene Zeile :mrgreen:
Delphi-Quellcode:
...:cat:...
if SHFileOperationA(SHFileOpStruct); = 0 then
ShowMessage('ja') else ShowMessage('nö'); |
Re: Kann man auch Ordner kopieren???
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein Beispiel-ZIP.
Der Ordner "C:\Temp\Chart" wird nach "E:\" kopiert. ...:cat:... |
Re: Kann man auch Ordner kopieren???
ich habe es nun alles am laufen... doch es gibt noch eine kleine feinheit.. kann man es auch irgendwie machen, dass, wenn etwas kopiert wird, dies nicht im fenster angezeigt wird, sondern im hintergrund kopiert wird?
hoffe ihr könnt mir helfen ;) vielen dank im voraus mfg seno |
Re: Kann man auch Ordner kopieren???
Hallo seno,
du must bei den "flags" den Wert FOF_SILENT setzen. Gruß Pfoto |
Re: Kann man auch Ordner kopieren???
Hey,
ich war auf der Suche nach genau dem gleichen Problem, danke also schonmal für die Lösung^^ Ich bräuchte allerdings noch einen weiteren Parameter, und zwar, dass das Programm fehlerhafte Dateien einfach überspringt und weiter kopiert, also eine Art ignore-Befehl. Gibt es da Möglichkeiten? :) Frohes Fest und Grüße, Morph |
Re: Kann man auch Ordner kopieren???
Hallo herzlich Willkommen!
Es gibt die Parameter "FOF_NOERRORUI or FOF_NOCONFIRMATION", nur ob die das bewirken, was du gerne hättest, weiß ich nicht. Das müsstest du mal ausprobieren. ;) Die Frage ist, was genau du erreichen möchtest. Denn bei einem Kopiervorgang Dateien zu überspringen ist unter Umständen nicht so günstig, da man so nicht weiß, ob der Kopiervorgang vollständig war oder nicht. Um ein Backup zu erstellen würde sich beispielsweise auch bitweises Kopieren anbieten. |
Re: Kann man auch Ordner kopieren???
Zitat:
Mein Vater schießt immer einen Haufen Photos, die er auf seiner Festplatte speichert. Wenn er jetzt die ganzen Dateien auf eine externe HDD kopieren will, bricht das ganze immer ab, weil irgendwo "defekte Dateien" dabei sind. Nun wollte ich ein Programm in Delphi schreiben, welches das Problem behebt, indem es die fraglichen Dateine (sprich: höchstwahrscheinlich Photos) überspringt. Das Programm sollte aber natürlich auch generell funktionieren^^ Man könnte sich das ganze also wie den XCOPY-Befehl mit dem /C- Parameter vorstellen, nur halt hübsch verpackt in einem Delphiprogramm mit frei wählbarem Quell-und Zielpfad, was ich ja bisher auch geschafft habe ;) Mir fehlt halt lediglich noch dieser /C- Parameter, also das Kopieren der Ordner bzw. Dateien, auch wenn Fehler auftreten. Werde jetzt erstmal deine Parameter ausprobieren. Gruß, Morph PS: Bin übrigens noch nicht wirklich ein Delphi-Kenner, beschäftige mich erst seit 2 Monaten damit. Deshalb würde ich darum bitten, mir immer ein bisschen zu erklären, was ich wo machen soll :) Edit: Wo soll ich denn deine Parameter einbauen, damit das ganze funktioniert?
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TiXCOPY = class(TForm) Edit1: TEdit; Edit2: TEdit; BitBtn1: TBitBtn; iXCOPY: TLabel; Label1: TLabel; Label2: TLabel; BitBtn2: TBitBtn; BitBtn3: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var iXCOPY: TiXCOPY; A, B : String; implementation uses ShellAPI; {$R *.dfm} function DoFileWork(aOperation: FILEOP_FLAGS; aFrom, aTo: AnsiString; Flags: FILEOP_FLAGS): Integer; var FromPath, ToPath: AnsiString; SHFileOpStruct: TSHFileOpStruct; begin FromPath := aFrom + #0#0; ToPath := aTo + #0#0; with SHFileOpStruct do begin Wnd := 0; wFunc := aOperation; pFrom := PAnsiChar(FromPath); if ToPath <> '' then begin pTo := PAnsiChar(ToPath) end else begin // target available pTo := nil; end; // target not available fFlags := Flags; end; // structure Result := SHFileOperationA(SHFileOpStruct); end; procedure TiXCOPY.BitBtn1Click(Sender: TObject); begin A := edit1.text; B := edit2.text; DoFileWork(FO_COPY, A, B, 0); end; procedure TiXCOPY.BitBtn2Click(Sender: TObject); begin close; end; procedure TiXCOPY.BitBtn3Click(Sender: TObject); begin edit1.text := ''; edit2.text := ''; end; end. |
Re: Kann man auch Ordner kopieren???
aFlags ist der Parameter, dem du das übergeben musst:
Delphi-Quellcode:
Das steht aber auch hier:
function DoFileWork(
aWnd: HWND; aOperation: UINT; aFrom, aTo: TStrings; aFlags: FILEOP_FLAGS ): Integer; ![]() |
Re: Kann man auch Ordner kopieren???
Okay, danke Matze :)
bricht er denn das Kopieren dann ab und gibt nur keine Fehlermeldung raus oder unterdrückt er die Fehlermeldung und macht trotzdem mit dem Kopieren weiter? Denn Letzteres ist ja das, was ich brauche. Vielen Dank für deine Mühe, Morph |
Re: Kann man auch Ordner kopieren???
Hallo maximi & Morph,
hier mal ein Beispiel für Copy und Move. aWND das Fenster das die Funktion aufruft z.B. Application.Handle. Bei DoMove wird Datei verschoben. IsAborted wird True wenn der User auf „Abbrechen“ glickt. Und bei den Flags lohnt sich’s mal die API- Hilfe anzuschauen. FOF_SILENT steht für keinen Dialog. FOF_NOERRORUI für keine Fehlermeldung anzeigen. FOF_NOCONFIRMMKDIR für keine Nachfrage ob Ordner erstellt warden soll.
Delphi-Quellcode:
Hier ein Aufruf
function Sh_FileCopyMove(aWND: HWND; const Source,Dest: string; DoMove: boolean;
var IsAborted: boolean; Flags: FILEOP_FLAGS=0): Boolean; var fos : TSHFileOpStruct; s,d: String; begin Result:= False; if (Source='') or (Dest='') then exit; s:= Source; d:= Dest; if Source[Length(S)]<> #0 then S:=S+ #0; if D[Length(D)]<> #0 then D:=D+ #0; ZeroMemory(@fos,SizeOf(fos)); with fos do begin Wnd:= aWND; If DoMove then wFunc:= FO_Move else wFunc:= FO_COPY; if Flags=0 then fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI else fFlags:=Flags; fAnyOperationsAborted:= IsAborted; pFrom:=PChar(S); pTo:=PChar(D); end; Result:= SHFileOperation(fos)=0; IsAborted:= fos.fAnyOperationsAborted; end;
Delphi-Quellcode:
Gruß gispos
var IsAborted: boolean;
begin If not Sh_FileCopyMove(Handle; ‘E:\Ablage\Test.jpg’, F:\Neuer Ordner\Test.jpg, False, IsAborted) then begin If IsAborted then ShowMessage(‘Abbruch durch User’) else ShowMessage(‘Fehler beim kopieren’); end; |
Re: Kann man auch Ordner kopieren???
Zitat:
die Parameter hab ich mittlerweile verstanden :) Nur beantworten sie nicht meine Frage, bzw. nicht sicher. Der Parameter FOF_NOERRORUI zeigt zwar keine Fehlermeldung mehr an, wird dadurch aber auch weiterkopiert? Ich will ja erreichen, dass das Programm weiterkopiert, auch wenn bei einer Datei ein Fehler beim Kopieren auftritt. Also quasi ein Kopieren um jeden Preis. Gruß, Morph :hi: |
Re: Kann man auch Ordner kopieren???
Hier noch der Link zu einem Programm das dies alles u. noch mehr kann.
Bild u. Video Betrachter mit Datenbank. Über knapp 8 MB deshalb über rapidshare: ![]() Gruß gispos |
AW: Kann man auch Ordner kopieren???
Hallo ...
Ich muss dieses Topic jetzt nochmal pushen. Habe mir den Quelltext mal kopiert, nur leider wird bei mir kein Ordner kopiert ... :( kann mir mal einer einen Tip geben?
Code:
unit main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI; type TForm1 = class(TForm) cmd_start: TButton; procedure cmd_startClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; Function DeleteDir(DirName : string): Boolean; function Sh_FileCopyMove(aWND: HWND; const Source,Dest: string; DoMove: boolean; var IsAborted: boolean; Flags: FILEOP_FLAGS=0): Boolean; var Form1: TForm1; const backup_this = 'R:\'; backup_new = 'C:\Backup-FSS'; backup_old = 'C:\Backup-FSS(Old)'; implementation {$R *.dfm} procedure TForm1.cmd_startClick(Sender: TObject); var IsAborted: boolean; begin // rd /s /q Backup-FSS(Old) if DirectoryExists(backup_old) then DeleteDir(backup_old); // ren Backup-FSS Backup-FSS(Old) if DirectoryExists(backup_new) then MoveFile(backup_old, backup_new); // md Backup-FSS // xcopy "R:\*.*" .\Backup-FSS\ /e Sh_FileCopyMove(Handle, backup_this, backup_new, False, IsAborted) end; //----------------------------------------------------- Function DeleteDir(DirName : string): Boolean; var SHFileOpStruct : TSHFileOpStruct; DirBuf : array [0..255] of char; begin try Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ; FillChar(DirBuf, Sizeof(DirBuf), 0 ) ; StrPCopy(DirBuf, DirName) ; with SHFileOpStruct do begin Wnd := 0; pFrom := @DirBuf; wFunc := FO_DELETE; fFlags := FOF_ALLOWUNDO; fFlags := fFlags or FOF_NOCONFIRMATION; fFlags := fFlags or FOF_SILENT; end; Result := (SHFileOperation(SHFileOpStruct) = 0) ; except Result := False; end; end; //----------------------------------------------------- function Sh_FileCopyMove(aWND: HWND; const Source,Dest: string; DoMove: boolean; var IsAborted: boolean; Flags: FILEOP_FLAGS=0): Boolean; var fos : TSHFileOpStruct; s,d: String; begin Result:= False; if (Source='') or (Dest='') then exit; s:= Source; d:= Dest; if Source[Length(S)]<> #0 then S:=S+ #0; if D[Length(D)]<> #0 then D:=D+ #0; ZeroMemory(@fos,SizeOf(fos)); with fos do begin Wnd:= aWND; If DoMove then wFunc:= FO_Move else wFunc:= FO_COPY; //Flags auf 1, da ich Fehler sehen will ... if Flags=1 then fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI else fFlags:=Flags; fAnyOperationsAborted:= IsAborted; pFrom:=PChar(S); pTo:=PChar(D); end; Result:= SHFileOperation(fos)=0; IsAborted:= fos.fAnyOperationsAborted; end; end. Wenn ich das nun kompeliere und ausführen will kommt folgende Fehlermeldung: Cannot Copy File: Cannot read from the source file or disk. :( ich weiß einfach im Moment nicht weiter ... :( Einen schönen Nikolaus an alle. Gruß Kieni |
AW: Kann man auch Ordner kopieren???
Zitat:
|
AW: Kann man auch Ordner kopieren???
Delphi-Quellcode:
Abgesehn davon, daß man sowas eigentlich nicht macht.
except
Result := False; end; SHFileOperation wirft keine Exceptions ... jedenfalls nicht, wenn nichts extrem schlimmes passiert ist und sowas sollte man nicht einfach so verdecken/ignorieren. SHFileOperation hat ja auch ein Ergebnis. Wie wäre es, wenn du von mal die Results von MoveFile und Sh_FileCopyMove auswertest und bei einem False über ![]()
Delphi-Quellcode:
den geneueren Fehlergrund nachsiehst?
SysErrorMessage(GetLastError)
|
AW: Kann man auch Ordner kopieren???
@DeddyH
Code:
stimmt ... es muss so sein:
if DirectoryExists(backup_new) then MoveFile(backup_old, backup_new);
Code:
thanks...
if DirectoryExists(backup_new) then MoveFile(backup_new, backup_old);
@himitsu noch eine Frage: Wie/Wo kann ich den letzte Error auswerten lassen? In dieser Funktion? Diese Funktion sollte einfach nur diesen Befehl ausführen:
Code:
// md Backup-FSS
// xcopy "R:\*.*" .\Backup-FSS\ /e
Code:
es ist zum heulen :D
function Sh_FileCopyMove(aWND: HWND; const Source,Dest: string; DoMove: boolean;
var IsAborted: boolean; Flags: FILEOP_FLAGS=0): Boolean; var fos : TSHFileOpStruct; s,d: String; begin Result:= False; if (Source='') or (Dest='') then exit; s:= Source; d:= Dest; if Source[Length(S)]<> #0 then S:=S+ #0; if D[Length(D)]<> #0 then D:=D+ #0; ZeroMemory(@fos,SizeOf(fos)); with fos do begin Wnd:= aWND; If DoMove then wFunc:= FO_Move else wFunc:= FO_COPY; if Flags=1 then fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI else fFlags:=Flags; fAnyOperationsAborted:= IsAborted; pFrom:=PChar(S); pTo:=PChar(D); end; Result:= SHFileOperation(fos)=0; IsAborted:= fos.fAnyOperationsAborted; end; |
AW: Kann man auch Ordner kopieren???
Code:
Also hier bringt er mir die Fehlermeldung: "The Hadle is invalid"
if not Sh_FileCopyMove(Application.Handle, backup_this, backup_new, False, IsAborted) then
begin ShowMessage(SysErrorMessage(GetLastError)); end else ShowMessage('Funktioniert'); end; hab es schon geändert nach Application.handle... hmm |
AW: Kann man auch Ordner kopieren???
Delphi-Quellcode:
procedure Sh_FileCopyMove(aWND: HWND; const Source,Dest: string; DoMove: boolean;
var IsAborted: boolean; Flags: FILEOP_FLAGS=0); var fos : TSHFileOpStruct; s,d: String; begin Result:= False; if (Source='') or (Dest='') then exit; s:= Source; d:= Dest; if Source[Length(S)]<> #0 then S:=S+ #0; if D[Length(D)]<> #0 then D:=D+ #0; ZeroMemory(@fos,SizeOf(fos)); with fos do begin Wnd:= aWND; If DoMove then wFunc:= FO_Move else wFunc:= FO_COPY; if Flags=1 then fFlags:=FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI else fFlags:=Flags; fAnyOperationsAborted:= IsAborted; pFrom:=PChar(S); pTo:=PChar(D); end; if not (SHFileOperation(fos) = 0) then RaiseLastOSError; IsAborted:= fos.fAnyOperationsAborted; end;
Delphi-Quellcode:
try
Sh_FileCopyMove(...); except on E: Exception do ShowMessage(E.Message); end; |
AW: Kann man auch Ordner kopieren???
procedure -> function ;)
|
AW: Kann man auch Ordner kopieren???
Auf dem keinen Netbook Bildschirm habe ich einfach keine Übersicht. :(
|
AW: Kann man auch Ordner kopieren???
Ich bedanke mich schonmal bei euch!
folgender Fehler: Zitat:
|
AW: Kann man auch Ordner kopieren???
Na das vom Fenster:
Delphi-Quellcode:
.
Form1.Handle
|
AW: Kann man auch Ordner kopieren???
hmm...
das hatte ich schon porbiert... Wenn ich dann den Button drücke, kommt zuerst: Zitat:
Zitat:
Code:
irgendwie läuft das alles nicht, und ich steh momentan voll auf dem Schlauch. Kann es etwas damit zu tun haben, dass backup_this ein Netzlaufwerk (R:) ist?
try
Sh_FileCopyMove(Form1.Handle, backup_this, backup_new, False, IsAborted); except on E: Exception do ShowMessage(E.Message); end; Gruß Kieni |
AW: Kann man auch Ordner kopieren???
Zitat:
|
AW: Kann man auch Ordner kopieren???
Bei der Vermutung wäre es doch nahe liegen, es mal mit einem lokalen Laufwerk zu probieren.
|
AW: Kann man auch Ordner kopieren???
ähm, ja ..... da gehts wunderbar ... :)
ich depp ... :o okay, dann scheint der Pfad irgendwie falsch zu sein .. aber R:\ bleibt doch R:\ ich bedanke mich bei allen, die mir bis hierhin geholfen haben! |
AW: Kann man auch Ordner kopieren???
Kannst du denn mit dem Explorer auf das Laufwerk zu greifen?
|
AW: Kann man auch Ordner kopieren???
Ja, ohne Probleme.
|
AW: Kann man auch Ordner kopieren???
Könnte es vielleicht hieran liegen?
Zitat:
|
AW: Kann man auch Ordner kopieren???
?
Och nööööööööö ... Heißt, ich kann dieses Netzlaufwerk nicht mit diesem Befehl auf C:\ sichern? Man, dass kann doch nicht soooo schwer sein ... :( |
AW: Kann man auch Ordner kopieren???
Moment, Kopieren müsste doch gehen, nur Verschieben oder Löschen logischerweise nicht :gruebel:
|
AW: Kann man auch Ordner kopieren???
hmm ...
wie gesagt: über den Explorer kann ich drauf zugreifen, kopieren, lesen, .... DeddyH, du gibst mir Hoffnung. :D |
AW: Kann man auch Ordner kopieren???
Zitat:
Und es dementsprechend Probleme mit den Zugriffsrechten geben könnte? Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 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