wodSFTP API library - LoopItem Callback
    
 

Description

Called before wodSFTP performs operation on item from the GetFiles/PutFiles/DeleteFiles/LoopFiles sequence.


Syntax

void (*LoopItem)(void *Sftp, char *LocalFile, char *RemoteFile, DirItemTypes ItemType, int *Skip);

The LoopItem callback syntax has these parts:

Part Description
void *Sftp Handle of the created Sftp instance.
char *LocalFile Holds full path to file/folder on local disk
char *RemoteFile Holds full path to file/folder on remote server.
DirItemTypes ItemType A DirItemTypes enumeration. Type of the item - file, folder, symbolic link.
int *Skip When set to 0 (null, false), wodSFTP continues with operation on specified file. Otherwise, file is skipped.

Remarks

The LoopItem callback will be called as a result of the GetFiles, PutFiles, DeleteFiles and LoopFiles functions. TIt provides information about each item in the sequence (meaning file or folder) before actual operation on that item is executed - allowing you to optionally Skip the operation for this particular item.

Since both LocalFile and RemoteFile arguments can be changed, you can also cause operation to be performed on completely different files than it would be in original operation. LocalFile and RemoteFile point to 32k buffer that you can overwrite with new file/folder path.

For example, you can use LoopItem callback like this:

void SftpLoopItem(void *Sftp, char *LocalFile, char *RemoteFile, DirItemTypes ItemType, int *Skip)
{
   if (ItemType == typeDirectory)
   *Skip = FALSE;
   else
   {
      int i = strlen(RemoteFile);
      if (i>4)
      {
         if (!strcmp(&RemoteFile[i-4], ".txt"))
         {
            *Skip = FALSE;
            return;
         }
      }
      *Skip = TRUE;
 
 }
}


which means that only files ending with ".txt" are copied - others are skipped (but directories are created, just in case).

You can also use it like this: we will copy all ".txt" files to the same directory, no matter where they originate from:

void SftpLoopItem(void *Sftp, char *LocalFile, char *RemoteFile, DirItemTypes ItemType, int *Skip)
{
   int i = strlen(RemoteFile);
   if (i>4)
   {
      if (!strcmp(&RemoteFile[i-4], ".txt"))
      {
         char buff[MAX_PATH];
         sprintf(buff, "c:\\mytxtfiles\\file%d.txt", mycounter++);
         strcpy(LocalFile, buff);
         *Skip = FALSE;
         return;
      }
   }
   *Skip = TRUE;
}


above sample will not create directory structure at all - but still would copy all .txt files to differently named files on local disk.

NOTE: this callback is called only if you have created an instance of the SftpEventsStruct structure, and set its LoopItem member to the function implementing it.