Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kann man auch Ordner kopieren??? (https://www.delphipraxis.net/8631-kann-man-auch-ordner-kopieren.html)

Pfoto 20. Dez 2007 23:09

Re: Kann man auch Ordner kopieren???
 
Hallo seno,

du must bei den "flags" den Wert FOF_SILENT setzen.

Gruß
Pfoto

Morph 25. Dez 2007 10:51

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

Matze 25. Dez 2007 11:11

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.

Morph 25. Dez 2007 11:47

Re: Kann man auch Ordner kopieren???
 
Zitat:

Zitat von Matze
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.

Mein Problem ist folgendes:


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.

Matze 25. Dez 2007 12:11

Re: Kann man auch Ordner kopieren???
 
aFlags ist der Parameter, dem du das übergeben musst:

Delphi-Quellcode:
function DoFileWork(
  aWnd: HWND; aOperation: UINT; aFrom, aTo: TStrings; aFlags: FILEOP_FLAGS
): Integer;
Das steht aber auch hier: Dateioperationen mit SHFileOperation.

Morph 25. Dez 2007 12:23

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

gispos 25. Dez 2007 15:37

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:
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;
Hier ein Aufruf
Delphi-Quellcode:
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;
Gruß gispos

Morph 25. Dez 2007 16:41

Re: Kann man auch Ordner kopieren???
 
Zitat:

Zitat von gispos
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.

Hey Gispos...

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:

gispos 25. Dez 2007 16:43

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:
http://rapidshare.com/files/78993201...Evo.v1.03c.rar

Gruß gispos

Kieni 6. Dez 2010 09:11

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr.
Seite 2 von 6     12 34     Letzte »    

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