User Tools

Site Tools


multiple_20file_20operations

Multiple file operations

by Richard Russell, July 2007

The Windows API function SHFileOperation is very flexible, allowing you to perform common file-system operations (delete, copy, move/rename) on one or more files. It can optionally move 'deleted' files to the Recycle Bin, display a handy progress dialogue for lengthy operations and prompt for confirmation.

Initialisation


Before using the SHFileOperation API incorporate the following declarations in your program:

        FO_MOVE = 1
        FO_COPY = 2
        FO_DELETE = 3
        FOF_MULTIDESTFILES =  1
        FOF_CONFIRMMOUSE = 2
        FOF_SILENT = 4
        FOF_RENAMEONCOLLISION = 8
        FOF_NOCONFIRMATION = 16
        FOF_WANTMAPPINGHANDLE = 32
        FOF_ALLOWUNDO = 64
        FOF_FILESONLY = 128
        FOF_SIMPLEPROGRESS = 256 : REM shfo.fFlags.h& = 1
        FOF_NOCONFIRMMKDIR = 512 : REM shfo.fFlags.h& = 2

Deleting files


To delete one or more files use code similar to the following:

        DEF PROCdeletefiles(afsp$)
        LOCAL shfo{}
        DIM shfo{hWnd%, wFunc%, pFrom%, pTo%, fFlags{l&,h&}, \
        \        fAborted%, hNameMaps%, sProgress%}
        afsp$ += CHR$0 + CHR$0
        shfo.hWnd% = @hwnd%
        shfo.wFunc% = FO_DELETE
        shfo.pFrom% = PTR(afsp$)
        SYS "SHFileOperation", shfo{}
        ENDPROC

As shown the operation will display a progress dialogue and prompt the user for confirmation. If you prefer it to happen 'silently' initialise the fFlags member as follows:

        shfo.fFlags.l& = FOF_SILENT OR FOF_NOCONFIRMATION
        shfo.fFlags.h& = 0

You can specify that the files are moved to the Recycle Bin rather than permanently deleted as follows:

        shfo.fFlags.l& = FOF_ALLOWUNDO OR FOF_NOCONFIRMATION
        shfo.fFlags.h& = 0


Copying files


To copy one or more files use code similar to the following:

        DEF PROCcopyfiles(from$,dest$)
        LOCAL shfo{}
        DIM shfo{hWnd%, wFunc%, pFrom%, pTo%, fFlags{l&,h&}, \
        \        fAborted%, hNameMaps%, sProgress%}
        from$ += CHR$0 + CHR$0
        dest$ += CHR$0 + CHR$0
        shfo.hWnd% = @hwnd%
        shfo.wFunc% = FO_COPY
        shfo.pFrom% = PTR(from$)
        shfo.pTo% = PTR(dest$)
        SYS "SHFileOperation", shfo{}
        ENDPROC

The from$ parameter should contain one or more path/filenames separated by NULs (CHR$0); the filenames may include wildcard characters (? or *). The dest$ parameter should contain the path to the destination folder to which you want the files to be copied; this folder will be created if necessary.

As shown the operation will display a progress dialogue and prompt the user for confirmation. If you prefer it to happen 'silently' initialise the fFlags member as follows:

        shfo.fFlags.l& = FOF_SILENT OR FOF_NOCONFIRMATION
        shfo.fFlags.h& = FOF_NOCONFIRMMKDIR DIV 256

If you want to copy only files, rather than any subdirectories included in the from$ specification, add the “FOF_FILESONLY” flag.

Moving files


To move (or rename) one or more files use code similar to the following:

        DEF PROCmovefiles(from$,dest$)
        LOCAL shfo{}
        DIM shfo{hWnd%, wFunc%, pFrom%, pTo%, fFlags{l&,h&}, \
        \        fAborted%, hNameMaps%, sProgress%}
        from$ += CHR$0 + CHR$0
        dest$ += CHR$0 + CHR$0
        shfo.hWnd% = @hwnd%
        shfo.wFunc% = FO_MOVE
        shfo.pFrom% = PTR(from$)
        shfo.pTo% = PTR(dest$)
        SYS "SHFileOperation", shfo{}
        ENDPROC

The from$ parameter should contain one or more path/filenames separated by NULs (CHR$0); the filenames may include wildcard characters (? or *). The dest$ parameter should contain the path to the destination folder to which you want the files to be moved; this folder will be created if necessary.

As shown the operation will display a progress dialogue and prompt the user for confirmation. If you prefer it to happen 'silently' initialise the fFlags member as follows:

        shfo.fFlags.l& = FOF_SILENT OR FOF_NOCONFIRMATION
        shfo.fFlags.h& = FOF_NOCONFIRMMKDIR DIV 256

If you want to move only files, rather than any subdirectories included in the from$ specification, add the “FOF_FILESONLY” flag.

If, rather than moving all the files to the same destination folder, you want to move or rename them individually, initialise the fFlags member as follows:

        shfo.fFlags.l& = FOF_MULTIDESTFILES
        shfo.fFlags.h& = 0

Now the dest$ parameter must contain the same number of path/filename specifications as there are in from$, separated by NULs (CHR$0).

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
multiple_20file_20operations.txt · Last modified: 2024/01/05 00:21 by 127.0.0.1