` Printed Icetips Article

Icetips Article



Windows API: Using SHFileOperation to copy files using progress window
2005-08-08 -- John Christ
 
Newsgroups: softvelocity.public.clarion6

> Secondly, is there perhaps a better way of doing it.

How about using SHFileOperation?

GLOBAL embeds, Before File Declarations

!
! Shell File Operations
!
FO_MOVE                    EQUATE(0001h)
FO_COPY                    EQUATE(0002h)
FO_DELETE                  EQUATE(0003h)
FO_RENAME                  EQUATE(0004h)

FOF_MULTIDESTFILES         EQUATE(0001h)
FOF_CONFIRMMOUSE           EQUATE(0002h)
FOF_SILENT                 EQUATE(0004h)  ! don't create progress/report
FOF_RENAMEONCOLLISION      EQUATE(0008h)
FOF_NOCONFIRMATION         EQUATE(0010h)  ! Don't prompt the user.

                                          ! Fill in SHFILEOPSTRUCT.hNameMappings
                                          ! Must be freed using SHFreeNameMappings
FOF_WANTMAPPINGHANDLE      EQUATE(0020h)
FOF_ALLOWUNDO              EQUATE(0040h)
FOF_FILESONLY              EQUATE(0080h)  ! on *.*, do only files
FOF_SIMPLEPROGRESS         EQUATE(0100h)  ! means don't show names of files
                                          ! don't confirm making any needed dirs
FOF_NOCONFIRMMKDIR         EQUATE(0200h)
FOF_NOERRORUI              EQUATE(0400h)  ! don't put up error UI
                                          ! dont copy NT file Security Attributes
FOF_NOCOPYSECURITYATTRIBS  EQUATE(0800h)
FOF_NORECURSION            EQUATE(1000h)  ! don't recurse into directories.
                                          ! don't operate on connected elements.
FOF_NO_CONNECTED_ELEMENTS  EQUATE(2000h)
                                          ! during delete operation, 
                                          ! warn if nuking instead of recycling
                                          ! (partially overrides FOF_NOCONFIRMATION)
FOF_WANTNUKEWARNING        EQUATE(4000h)
SHFILEOPgroup         GROUP, TYPE
hwnd                  UNSIGNED
wFunc                 UNSIGNED
pFrom                 LONG
pTo                   LONG
fFlags                USHORT
fAnyOperationsAborted LONG
hNameMappings         LONG
lpszProgressTitle     LONG
  END

==========

GLOBAL embeds, Inside the Global Map

MODULE('Windows.lib')
  SHFileOperation(LONG pSHFILEOPgroup), LONG, PASCAL, |
    RAW, DLL,NAME('SHFileOperationA')
END

==========

Data

SHFileOp LIKE(SHFILEOPgroup)
Source CSTRING(256)
Destination CSTRING(256)

==========

Insert this where you want to perform the copy:

! This copies an entire directory - note the terminating <0>
Source = 'C:\TheSourceDirectory\*.*' & '<0>'
! This would copy 2 files
! The filenames are separated by <0>
! The list is terminated by <0><0>
Source = 'file1.exe<0>file2.exe<0><0>
Destination = 'C:\TheDestinationDirectory'

CLEAR(SHFileOp)
SHFileOp.hWnd   = 0{PROP:Handle}
SHFileOp.wFunc  = FO_COPY
SHFileOp.pFROM  = ADDRESS(Source)
SHFileOp.pTo    = ADDRESS(Destination)
SHFileOp.fFlags = FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR

SHFileOperation(ADDRESS(SHFileOp))

John



Printed May 2, 2024, 6:36 am
This article has been viewed/printed 35127 times.
Google search has resulted in 139 hits on this article since January 25, 2004.