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();


