Click here to Skip to main content
15,867,330 members
Articles / Programming Languages / C++
Article

CShellFileOp - Wrapper for SHFileOperation

Rate me:
Please Sign up or sign in to vote.
4.86/5 (21 votes)
26 Nov 19991 min read 212.9K   4.1K   64   31
An easy-to-use wrapper for the Win32 SHFileOperation function
  • Download demo project - 23 Kb
  • Download source files - 9 Kb

    The CShellFileOp class is designed to be an easy-to-use wrapper for the Win32 SHFileOperation() API. This function is powerful, but using it requires lots of bookkeeping.

    CShellFileOp hides the complex details of the API, and instead lets the programmer use familiar C++ constructs. It also does extensive error-checking of the parameters you use. This decreases headaches, reduces the amount of time the programmer loses wading through the docs, and in general makes everyone happy.

    CShellFileOp was written with MSVC 5.0 and tested with 6.0. The sample project is now in 6.0 format. I have also tested it in Unicode on NT 4.

    Example - Using CShellFileOp to copy files

    Below is example code showing the way CShellFileOp covers SHFileOperation(). I have included complete documentation for the class in each of the zip files accompanying this article. The docs are in the file CShellFileOp_docs.html.

    void CSomeDlg::CopySomeFiles()
    {
    CShellFileOp sfo;
    BOOL         bAPICalled;
    int          nAPIReturnVal;
    
        // This example copies a few files to the A: drive.
    
        // Pass the full paths to the files to be copied.
    
        sfo.AddSourceFile ( _T("c:\\windows\\command\\format.com") );
        sfo.AddSourceFile ( _T("c:\\windows\\command\\fdisk.exe") );
        sfo.AddSourceFile ( _T("c:\\*.com") );
    
        // Pass the destination directory
    
        sfo.AddDestFile ( _T("A:\\") );
    
        // Set up a few flags that control the operation.
    
        sfo.SetOperationFlags
        ( FO_COPY,         // the operation type (copy in this case)
          AfxGetMainWnd(), // pointer to parent window
          FALSE,           // flag - silent mode?
          FALSE,           // flag - allow undo?
          FALSE,           // flag - should wild cards affect files only?
          TRUE,            // flag - suppress confirmation messages?
          TRUE,            // flag - suppress confirmation messages 
                           // when making directories?
          FALSE,           // flag - rename files when name collisions occur?
          FALSE );         // flag - simple progress dialog?
              
        // Start the operation.
    
        if ( sfo.Go ( &bAPICalled, &nAPIReturnVal ) )
            {
            // The operation succeeded!
            }
        else
            {
            if ( !bAPICalled )
                {
                // SHFileOperation() wasn't called - check the info you passed
                // in to the CShellFileOp object.  The DEBUG version will
                // throw ASSERTs and/or show TRACE messages to help you out.
                }
            else
                {
                // SHFileOperation() returned nonzero (failure).  That return
                // value is now in nAPIReturnVal.
                }
            }
    }

    Revision History

    October 11, 1998: Version 1.0. First release.
    February 27, 2000: Version 1.1. Fixed a bug in CShellFileOp::Go() that allocated too much memory in Unicode builds.

    You can get the latest updates to this and my other articles at http://home.inreach.com/mdunn/code/

  • License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    Software Developer (Senior) VMware
    United States United States
    Michael lives in sunny Mountain View, California. He started programming with an Apple //e in 4th grade, graduated from UCLA with a math degree in 1994, and immediately landed a job as a QA engineer at Symantec, working on the Norton AntiVirus team. He pretty much taught himself Windows and MFC programming, and in 1999 he designed and coded a new interface for Norton AntiVirus 2000.
    Mike has been a a developer at Napster and at his own lil' startup, Zabersoft, a development company he co-founded with offices in Los Angeles and Odense, Denmark. Mike is now a senior engineer at VMware.

    He also enjoys his hobbies of playing pinball, bike riding, photography, and Domion on Friday nights (current favorite combo: Village + double Pirate Ship). He would get his own snooker table too if they weren't so darn big! He is also sad that he's forgotten the languages he's studied: French, Mandarin Chinese, and Japanese.

    Mike was a VC MVP from 2005 to 2009.

    Comments and Discussions

     
    GeneralOnly copying done not replacing !!! Pin
    Le@rner29-Jul-08 0:02
    Le@rner29-Jul-08 0:02 
    QuestionRe: Only copying done not replacing !!! Pin
    David Crow29-Apr-10 10:29
    David Crow29-Apr-10 10:29 
    GeneralUsing SHFileOperation real return values Pin
    erangi3-Oct-06 2:13
    erangi3-Oct-06 2:13 
    GeneralGood work Pin
    Franc Morales7-May-06 19:44
    Franc Morales7-May-06 19:44 
    QuestionCustom Error message? Pin
    Bernhard8-Jan-06 20:27
    Bernhard8-Jan-06 20:27 
    AnswerRe: Custom Error message? Pin
    Michael Dunn8-Jan-06 20:55
    sitebuilderMichael Dunn8-Jan-06 20:55 
    GeneralRe: Custom Error message? Pin
    Bernhard8-Jan-06 21:25
    Bernhard8-Jan-06 21:25 
    GeneralPosition of window Pin
    Fred_12322-Oct-04 2:45
    Fred_12322-Oct-04 2:45 
    GeneralRe: Position of window Pin
    Michael Dunn27-Oct-04 13:52
    sitebuilderMichael Dunn27-Oct-04 13:52 
    GeneralRe: Position of window Pin
    Rainer Schuster27-Sep-05 3:01
    Rainer Schuster27-Sep-05 3:01 
    GeneralLittle improvement Pin
    peterchen11-Aug-04 14:42
    peterchen11-Aug-04 14:42 
    GeneralNotifications Pin
    Monty215-Jun-04 23:36
    Monty215-Jun-04 23:36 
    GeneralProgress Dialog Pin
    tyounsi11-May-04 16:18
    tyounsi11-May-04 16:18 
    GeneralErrors compiling with Visual Studio 2003 Pin
    kimmov28-Feb-04 1:27
    kimmov28-Feb-04 1:27 
    GeneralRe: Errors compiling with Visual Studio 2003 Pin
    Michael Dunn28-Feb-04 6:11
    sitebuilderMichael Dunn28-Feb-04 6:11 
    GeneralFilenames missing Pin
    lufutusi17-Nov-03 21:18
    lufutusi17-Nov-03 21:18 
    GeneralThe source of my files to copy is a network drive Pin
    IHR18-Dec-02 12:14
    IHR18-Dec-02 12:14 
    GeneralRe: The source of my files to copy is a network drive Pin
    IHR13-Aug-03 4:32
    IHR13-Aug-03 4:32 
    GeneralRe: The source of my files to copy is a network drive Pin
    veraart24-Feb-06 0:57
    veraart24-Feb-06 0:57 
    GeneralConstant Created date Pin
    naju9-Sep-02 0:25
    naju9-Sep-02 0:25 
    GeneralRe: Constant Created date Pin
    Blake Miller26-Nov-02 5:12
    Blake Miller26-Nov-02 5:12 
    GeneralSHFileOperation Error Codes Pin
    7-Jul-02 13:58
    suss7-Jul-02 13:58 
    GeneralRe: SHFileOperation Error Codes Pin
    noirs213-Apr-05 5:00
    noirs213-Apr-05 5:00 
    GeneralRe: SHFileOperation Error Codes Pin
    Bartosz Bien5-Sep-05 1:13
    Bartosz Bien5-Sep-05 1:13 
    AnswerRe: SHFileOperation Error Codes Pin
    IAteTheWholeThing220-Sep-06 22:27
    IAteTheWholeThing220-Sep-06 22:27 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.