Category: App Engine

Create Directory Listing of Files In App Engine

Need to know dynamically which files are in a given folder?

May 2018 Update:  You can use function FindFiles to do this.

Also, apologies on the Ampersand.  We are working on making it not be &.

 &file_names = FindFiles(&file_loc, %FilePath_Absolute);

The code further in this article is the old way to do this.

The code below will allow you to list all of the files in a given directory, then allow you to open each file.  It could be useful to read which files have been recently added to an upload folder.  I used this code to read which files had recently been placed in the process scheduler working folder (first SQLExec in code example).

Details:  We run a system command to get a directory listing, and we send that output to a new file, in the same directory.  Then we open that new file and review which files were found.

/*Setup the Slash variable*/
If &OS = "Windows" Then 
    &slash = "\";
else 
    &slash = "/";
End-if;
/*Get the current working folder - You may want to use a static folder where files are being uploaded to - If you use this SQLExec, process instance &ProcInst*/
SQLExec("SELECT PRCSOUTPUTDIR FROM PSPRCSPARMS WHERE PRCSINSTANCE = :1", &ProcInst, &DirectoryLocation); 

/*Setup the filename to output to.*/
&DirectoryFileName = "FileListing_" | &ProcInst | ".filelisting"; 

/*Setup the folder to write the file to*/ 
&DirectoryListing = &DirectoryLocation | &slash | &DirectoryFileName; 

If &OS = "Windows" Then 
    &CMD_TO_RUN = "cmd.exe /c dir """ | &DirectoryLocation | """ /b > """ | &DirectoryListing | """";
Else 
    &CMD_TO_RUN = "ls """ | &DirectoryLocation | """ > """ | &DirectoryListing | """";
End-If; 

/*It is always best to Commit the work before running Exec*/ 
CommitWork();
try 
    &return_value = Exec(&CMD_TO_RUN, %Exec_Synchronous + %FilePath_Absolute); 
catch Exception &e 
    MessageBox(0, "", 0, 0, "Error Found. Exception is " | &e | " with return value " | &return_value); 
    MessageBox(0, "", 0, 0, "Command sent was " | &CMD_TO_RUN); 
    MessageBox(0, "", 0, 0, "Going to Next step in App Engine."); 
end-try; 

Local File &f1, &f2; 
&f1 = GetFile(&DirectoryListing, "r", %FilePath_Absolute); 
While &f1.ReadLine(&RowOfData); 
/*Skip the file if the filename matches our Directory File name*/ 
    If &RowOfData <> &DirectoryFileName Then
        MessageBox(0, "", 0, 0, "Processing Filename " | &RowOfData); 
        &Columns_array = Split(&RowOfData, "."); /*Useful to read the file extension. Use variable Upper(&Columns_array [2])*/ 
        &f2 = GetFile(&DirectoryLocation | &slash | &RowOfData, "r", %FilePath_Absolute);
        While &f2.ReadLine(&F2RowOfData);
            /*Process the row of data, using variable &F2RowOfData*/
        End-While;
    End-If;
End-While;

&f1.Close();

Turn SQL and PeopleCode Trace on for Application Engine

  1.  Go into the process definition of the Application Engine.
  2. On the “Override Options” tab, on the parameter list, choose APPEND and enter the following:
    -TRACE 7 -TOOLSTRACEPC 3596 -TOOLSTRACESQL 131

    Change the numbers to reflect the level of tracing you desire.
  3. Run the App Engine through the normal processing pages. In the process monitor, you can retrieve the SQL and PeopleCode trace files with the logs.
  4. Once you are finished, change the settings back (most likely it was originally set as NONE).