[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: help - IFS



Hi Giel.

You can use this.

     D/copy dcpyb/qs36src,IFSIO_H
     d dir             s               *
     D Msg             S            256A
     D wDirPath        s            256
     D wfpath          s            256
     D wfullpath       s            256

      /free

       wfpath = '/tmp/ronnie/';
       //must add hex 00 to the end
       wfullpath = %trim(wfpath) + x'00';
       dir  = opendir(%addr(wfullpath));

       if dir <> *NULL;

         p_dirent = readdir(dir);
         dow p_dirent <> *NULL;
           Msg = %subst(d_name:1:d_namelen);

           if msg <> '.'
              and msg <> '..'
              and msg <> *blanks;

             wdirpath = %trim(wfpath)
                 + %trim(msg) + x'00';
             //this is now your full path plus the file name//
             //do whatever you want to do with the file read it etc.//
           endif;
           p_dirent = readdir(dir);
         enddo;

         callp closedir(dir);

       endif;

Alternatively you can use this proc which you can call for one directory and it will call itself recursively for subdirs.

     D do_dir          PR            10I 0
     D   peDir                      640A   const
     D errno           PR            10I 0
     D is_dir          PR             1A
     D    peDir                     640A   const

      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      // This procedure calls itself recursively for each subdirectory
      // in a directory.
      //
      // For each non-subdir in the directory, it handles the file       	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     P do_dir          B
     D do_dir          PI            10I 0
     D   peDir                      640A   const

     D dh              S               *
     D wwDirname       S            640A
     D wwFile          S            640A
     D wwLen           S             10I 0
     D FtpDir          S            640A
     D LocalDirp       S            640A
     D LocalFile       S            640A
     D wdPos           S             10I 0
     D mystat          s                   like(statds64)

      // Strip off trailing '/'
      /FREE

       wwLen = %len(%trimr(peDir));
       if wwLen>1 and %subst(peDir:wwLen:1) = '/';
         wwDirname = %subst(peDir:1:wwLen-1);
       else;
         wwDirname = peDir;
       endif;

       LocalDirp = peDir;
       // Open local directory
       dh = opendir(%trimr(LocalDirp));
       if dh = *NULL;
         diagmsg('opendir(): ' +
             %str(strerror(errno)));
         return -1;
       endif;

       dow 1 = 1;

         // Read next directory entry
         p_dirent = readdir(dh);
         if p_dirent = *NULL;
           leave;
         endif;

         // Skip special files "." and ".."
         wwFile = %subst(d_name: 1: d_namelen);
         if wwFile = '.' or wwFile = '..';
           iter;
         endif;

         // Get stat structure for local file
         if %subst(LocalDirp:%len(%trim(LocalDirp)):1) = '/';
           LocalFile = %trim(LocalDirp) + wwFile;
         else;
           LocalFile = %trim(LocalDirp) + '/' + wwFile;
         endif;

         if stat(%trimr(LocalFile): %addr(mystat))<0;
           diagmsg('stat(): ' + %trim(wwFile) +
               ': ' + %str(strerror(errno)));
         endif;

         // If local file is a directory, call this procedure again,
         // with the new directory name.
         p_statds64 = %addr(mystat);
         if S_ISDIR(st_mode);
		//if you want to something because it is a directory put it here
             if %subst(LocalDirp:%len(%trim(LocalDirp)):1) = '/';
               if do_dir(%trimr(LocalDirp) +
                  wwFile:*blanks) < 0;
                 return -1;
               endif;
             else;
               if do_dir(%trimr(LocalDirp) + '/' +
                  wwFile:*blanks) < 0;
                 return -1;
               endif;
             endif;
         else;
           // Otherwise, assume it's a file, and do something with it.			//do file processing here
		//I usually have a separate proc or program to deal the file.
		//So I always call some program here passing the full file name
		//I have though about making it a parm to the proc which will
		//make it more reusable but not there yet.
         ENDIF;
       enddo;

       closedir(dh);
       return 0;           
      /END-FREE
     P                 E

You are going to need this as well (cant recall where I got this but I think it was from one of Scott's sites).

      *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      *  This tests a file mode to see if a file is a directory.
      *
      * Here is the C code we're trying to duplicate:
      *      #define _S_IFDIR    0040000                                       */
      *      #define S_ISDIR(mode) (((mode) & 0370000) == _S_IFDIR)
      *
      * 1) ((mode) & 0370000) takes the file's mode and performs a
      *      bitwise AND with the octal constant 0370000.  In binary,
      *      that constant looks like: 00000000000000011111000000000000
      *      The effect of this code is to turn off all bits in the
      *      mode, except those marked with a '1' in the binary bitmask.
      *
      * 2) ((result of #1) == _S_IFDIR)  What this does is compare
      *      the result of step 1, above with the _S_IFDIR, which
      *      is defined to be the octal constant 0040000.  In decimal,
      *      that octal constant is 16384.
      *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     P S_ISDIR         B
     D S_ISDIR         PI             1N
     D   mode                        10U 0 value

     D                 DS
     D  dirmode                1      4U 0
     D  byte1                  1      1A
     D  byte2                  2      2A
     D  byte3                  3      3A
     D  byte4                  4      4A

      * Turn off bits in the mode, as in step (1) above.
     c                   eval      dirmode = mode

     c                   bitoff    x'FF'         byte1
     c                   bitoff    x'FE'         byte2
     c                   bitoff    x'0F'         byte3
     c                   bitoff    x'FF'         byte4

      * Compare the result to 0040000, and return true or false.
 B01 c                   if        dirmode = 16384
     c                   return    *On
 X01 c                   else
     c                   return    *Off
 E01 c                   endif
     P                 E

      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      //  Get the UNIX/C error number
      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     P errno           B
     D errno           PI            10I 0
     D p_errno         S               *
     D wwreturn        S             10I 0 based(p_errno)
      /FREE
       p_errno = c__errno;
       return wwreturn;
      /END-FREE
     P                 E          


Ronnie Visser
+27 11 012 8700.
082 322 7920
 

-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Giel van der Merwe
Sent: Thursday, August 16, 2012 1:56 PM
To: HTTPAPI and FTPAPI Projects
Subject: RE: help - IFS

This looks like a good way to go I tried adding it to a rpg program

	c                   eval      p_dirent = readdir(d)     
     	c                   dow       p_dirent <> *NULL         
     	C* ...do whatever we like with the contents             
     	C*    of the dirent structure, here...                  
     	c                   eval      p_dirent = readdir(d)     
     	c                   enddo                               

but I am not sure how to define "D", would you know, I tried replacing it with '/QDLS/GIEL'

-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Craig Jacobsen
Sent: 16 August 2012 12:47 PM
To: HTTPAPI and FTPAPI Projects
Subject: RE: help - IFS

Giel,

I would just use readdir using Scott's IFS stuff.
Here is a reference:
http://www.scottklement.com/rpg/ifs_ebook/readdir.html


Craig 


-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx [mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Giel van der Merwe
Sent: Wednesday, August 15, 2012 3:58 PM
To: ftpapi@xxxxxxxxxxxxxxxxxxxxxx
Subject: help - IFS

I get sent a XML file that is placed on the IFS in a dedicated library, but the file name changes, what would you recommend I do to get the file name, so that I could process in my RPGLE program, any ideas?

Giel van der Merwe


#####################################################################################

The provisions of Sections 11,12, and 13 of the Electronic Communications and Transactions Act, 25 of 2002, in so far as e-contracting is concerned is expressly excluded and contracted out by  Barloworld South Africa (Pty) Ltd ("Barloworld") and no data message or electronic communication will be recognised as having legal contractual status as per the aforementioned provisions under any circumstances. All contracts concluded by Barloworld, its Business Units, Divisions and Subsidiaries will only be legally binding and recognised once reduced to physical writing and physically signed by a duly authorised representative of Barloworld. 

All other provisions of  the Electronic Communications and Transactions Act, 25 of 2002 are accepted. 

#####################################################################################
Note:
This message is for the named person's use only.  It may contain confidential, proprietary or legally privileged information.  No confidentiality or privilege is waived or lost by any mistransmission.  If you receive this message in error, please immediately delete it and all copies of it from your system, destroy any hard copies of it and notify the sender.  You must not, directly or indirectly, use, disclose, distribute, print, or copy any part of this message if you are not the intended recipient. Avis and any of its subsidiaries each reserve the right to monitor all e-mail communications through its networks.

Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorized to state them to be the views of any such entity.

Thank You.
##################################################################################### 

Confidentiality Notice: This e-mail message, including any attachments, is for the sole use of the intended recipient(s) and may contain confidential and privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message.  Unless expressly stated in this e-mail, nothing in this message or any attachment should be construed as a digital or electronic signature.
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------


#####################################################################################

The provisions of Sections 11,12, and 13 of the Electronic Communications and Transactions Act, 25 of 2002, in so far as e-contracting is concerned is expressly excluded and contracted out by  Barloworld South Africa (Pty) Ltd ("Barloworld") and no data message or electronic communication will be recognised as having legal contractual status as per the aforementioned provisions under any circumstances. All contracts concluded by Barloworld, its Business Units, Divisions and Subsidiaries will only be legally binding and recognised once reduced to physical writing and physically signed by a duly authorised representative of Barloworld. 

All other provisions of  the Electronic Communications and Transactions Act, 25 of 2002 are accepted. 

#####################################################################################
Note:
This message is for the named person's use only.  It may contain confidential,
proprietary or legally privileged information.  No confidentiality or privilege
is waived or lost by any mistransmission.  If you receive this message in error,
please immediately delete it and all copies of it from your system, destroy any
hard copies of it and notify the sender.  You must not, directly or indirectly,
use, disclose, distribute, print, or copy any part of this message if you are not
the intended recipient. Avis and any of its subsidiaries each reserve
the right to monitor all e-mail communications through its networks.

Any views expressed in this message are those of the individual sender, except where
the message states otherwise and the sender is authorized to state them to be the
views of any such entity.

Thank You.
##################################################################################### 
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------