Avatar billede Slettet bruger
28. september 1999 - 19:02 Der er 4 kommentarer og
2 løsninger

hjælp med copering

hvordan for jeg delphi til at kopier en hen mappe eller et heldt drev af gangen.
Progarmmet skal kopier alt hvad der er på a:\ til en mappe som liger c:\windows\skrivebord\ny mappe

Avatar billede dj Nybegynder
28. september 1999 - 19:20 #1
Denne unit viser hvordan du bruger copy, move osv. ligesom hvis du brugte stifinder til at gøre det med. Den viser dog også kopieringsboksen ligesom stifinder!

unit win95;

{For copying, moving and erasing files and folders like Windows 95 Explorer.}

interface
Uses Classes, ShellApi, ShlObj, Registry, Windows;
type
  Str10  = String[10];

Const
  fpRootKey ='\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders';
  fpDesktop  : Str10 = 'DESKTOP';
  fpFavorites : Str10 = 'FAVORITES';
  fpFonts    : Str10 = 'FONTS';
  fpPersonal  : Str10 = 'PERSONAL';
  fpPrograms  : Str10 = 'PROGRAMS';
  fpRecent    : Str10 = 'RECENT';
  fpSendTo    : Str10 = 'SENDTO';
  fpStartMenu : Str10 = 'START MENU';
  fpStartup  : Str10 = 'STARTUP';
  fpTemplates : Str10 = 'TEMPLATES';


{Windows Paths}
function GetFolderPath(Const FolderName: Str10): String;

{Files functions}
procedure Win95AddToRecentDocs(Const Filename: string);
procedure Win95ClearRecentDocs;

function Win95Copy(Owner: Integer;  FromFile,ToFile: String; RenameOnCollision, Confirm: boolean): Boolean;
function Win95Move(Owner: Integer;  FromFile,ToFile: String; RenameOnCollision, Confirm: boolean): Boolean;

{If SendToRecycleBin is true then files will be sent to Windows
RecycleBin else they will be wiped out}
function Win95Erase(Owner: Integer;  WichFiles: String; SendToRecycleBin, Confirm: Boolean): Boolean;

implementation

function GetFolderPath(Const FolderName: Str10): String;
begin
  with TRegistry.Create do
    Try
      RootKey:=HKEY_CURRENT_USER;
      OpenKey(fpRootKey,False);
      Result:=ReadString(FolderName);
    finally
      Free;
    end;
end;

procedure Win95AddToRecentDocs(Const Filename: string);
begin
  SHAddToRecentDocs(SHARD_PATH, @Filename[1]);
end;

procedure Win95ClearRecentDocs;
begin
  SHAddToRecentDocs(SHARD_PATH, nil);
end;

function Win95Copy(Owner: Integer; FromFile,ToFile: String; RenameOnCollision, Confirm: boolean): Boolean;
var
  Struct : TSHFileOpStructA;
  MultDest: boolean;
begin
  FillChar(Struct, SizeOf(Struct), 0); MultDest:=pos(';',ToFile)>0;
  While pos(';',FromFile)>0 do
    FromFile[pos(';',FromFile)]:=#0;
  While pos(';',ToFile)>0 do
    ToFile[pos(';',ToFile)]:=#0;
  FromFile:=FromFile+#0#0;
  ToFile:=ToFile+#0#0;
  with Struct do
    begin
      wnd        :=Owner;
      wFunc      :=FO_Copy;
      pFrom      :=PChar(FromFile);
      pTo        :=PChar(ToFile);
      fFlags:=FOF_ALLOWUNDO or FOF_FILESONLY;
      If MultDest then
        fFLags:=fFlags or FOF_MULTIDESTFILES;
      If RenameOnCollision then
        fFLags:=fFlags or FOF_RENAMEONCOLLISION;
      If not Confirm then
      begin
        fFLags:=fFlags or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      end;
      hNameMappings:=nil;
      lpszProgressTitle:=nil;
    end;
  result:=(SHFileOperationA(Struct)=0) and (not Struct.fAnyOperationsAborted);
end;

function Win95Move(Owner: Integer;  FromFile,ToFile: String; RenameOnCollision, Confirm: boolean): Boolean;
var
  Struct : TSHFileOpStructA;
  MultDest: boolean;
begin
  FillChar(Struct, SizeOf(Struct), 0); MultDest:=pos(';',ToFile)>0;
  While pos(';',FromFile)>0 do
    FromFile[pos(';',FromFile)]:=#0;
  While pos(';',ToFile)>0 do
    ToFile[pos(';',ToFile)]:=#0;

  FromFile:=FromFile+#0#0;
  ToFile:=ToFile+#0#0;
  with Struct do
    begin
      wnd        :=Owner;
      wFunc      :=FO_Move;
      pFrom      :=PChar(FromFile);
      pTo        :=PChar(ToFile);
      fFlags:=FOF_ALLOWUNDO or FOF_FILESONLY;
      If MultDest then
        fFLags:=fFlags or FOF_MULTIDESTFILES;
      If RenameOnCollision then
        fFLags:=fFlags or FOF_RENAMEONCOLLISION;
      If Confirm then
        fFLags:=fFlags or FOF_NOCONFIRMATION;
      hNameMappings:=nil;
      lpszProgressTitle:=nil;
    end;
  result:=(SHFileOperationA(Struct)=0) and (not Struct.fAnyOperationsAborted);
end;

function Win95Erase(Owner: Integer;  WichFiles: String;  SendToRecycleBin, Confirm: Boolean): Boolean;
var
  Struct : TSHFileOpStructA;
begin
  FillChar(Struct, SizeOf(Struct), 0);
  While pos(';',WichFiles)>0 do
    WichFiles[pos(';',WichFiles)]:=#0;
  WichFiles:=WichFiles+#0#0;
  with Struct do
    begin
      wnd        :=Owner;
      wFunc      :=FO_Delete;
      pFrom      :=PChar(WichFiles);
      pTo        :=nil;
      If not Confirm then
        fFlags:=FOF_NOCONFIRMATION;
      If SendToRecycleBin then
        fFLags:=fFlags or FOF_ALLOWUNDO or FOF_FILESONLY
      else
        fFlags:=fFlags or 0 or FOF_FILESONLY;
      hNameMappings:=nil;
      lpszProgressTitle:=nil;
    end;
  result:=(SHFileOperationA(Struct)=0) and (not Struct.fAnyOperationsAborted);
end;

end.
Avatar billede tknudsen Nybegynder
28. september 1999 - 22:57 #2
ehhh - er det ikke der samme spørgsmål som lojmann stillede for et par dage siden ?
Avatar billede tigerdyr Nybegynder
29. september 1999 - 07:51 #3
Stort set...
Avatar billede snorga Nybegynder
29. september 1999 - 09:05 #4
Hmm.. API måden at gøre det på. Min måde at gøre det på var sjovere at side at lave :) Der kunne man også bedre overskue hvad der foregik..
(se http://www.eksperten.dk/spm.asp?id=4646)
Avatar billede lrj Nybegynder
29. september 1999 - 12:40 #5
Well, der er altså 2 overordnede måder at gøre det på: Med api som her, hvor man så kan se den fjollede dialog med to mapper og flyvende filer. Eller den anden, som snorga foreslår, hvor det hele foregår i delphi-programmet - og man selv bestemmer hvad der foregår.

Så kan man jo vælge sin stil - er den ikke en explorer-erstatning du er ved at lave, er overstående nok overkill... :)

Mine 2c
Avatar billede snorga Nybegynder
29. september 1999 - 12:43 #6
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester