How to copy entire folder structure from C++?

Is there a Windows API function that will copy an entire folder structure?  I am particularly interested in a solution that doesn't abort if one of the files can't be copied because of a sharing vilation.

Only an answer that will give me the above solution will be accepted.  If there's no way to do this via a Windows API call, then a code snippet will be accepted, otherwise the answer will be rejected.
LVL 1
shrifAsked:
Who is Participating?
 
jkrCommented:
Thanx shrif ;-)
0
 
luisrCommented:

There is no Windows API. What you can do is for a folder repetedly call FindFirstFile/FindNextFile and copy the files (with CopyFile), and when a directory is found, call the same function recursively.

I cannot give you a code snippet right now because I don't remember the parameters to all those APIs, but if you are interested, I can look them up in help and write those functions for you. I work in C/C++, so if you work in another language, I could write a simple DLL for you.

Anyway, send me an e-mail to luisr@iname.com if you are interested.

0
 
raybCommented:
How about using the DOS command xcopy with the /s option?
You can fire it off from your c++ code using the CreateProcess API.
0
Cloud Class® Course: Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

 
jkrCommented:
Hmm - this can be done much easier, 'SHFileOperation()' should do the job...
0
 
shrifAuthor Commented:
thanks.
0
 
ramrocketCommented:
I'm not aware of a single API that will solve your problem but here is a
propose solution

int CopyFiles(char *szFromDir, char *szToDir)
{
      long hFile;
      struct _finddata_t fd;
      char szBuffer[256];

      sprintf(szBuffer,"%s\\*.*", szFromDir);
      if( (hFile = _findfirst(szBuffer, &fd)) == -1L ) return(-1);

      do
          {
            char szFrom[256],szTo[256];
            if(*fd.name !='.')
            {
                  sprintf(szFrom,"%s\\%s",szFromDir,fd.name);
                  sprintf(szTo,"%s\\%s",szToDir,fd.name);

                  //check for subdirectories
                  sprintf(szFileName,"%s\\%s",szDir,fd.name);

                  //check for volume space remaining
                  CFileStatus status;
                  CFile::GetStatus(szFileName, status );
                  if(status.m_attribute==      0x10) //directory
                        CopyFiles(szFrom,szTo);
            }         

    }while(_findnext(hFile, &fd) == 0);
    _findclose( hFile );

return(0);
}

0
 
shrifAuthor Commented:
jkr, repost as an 'answer'

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.