diff --git a/README.md b/README.md
index 2075c8e..976485a 100644
--- a/README.md
+++ b/README.md
@@ -23,10 +23,12 @@ format x bool.;
%zipLibrary(sashelp,libOut=work)
%bpPIPE(ls -la ~/)
+
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result)
```
and more.
-SHA256 digest for the latest version of `BasePlus`: A6F1977DC4EC22A39DDC7BCE68CF562AF54351A3D385D488EC3067B5A7C0F3CB
+SHA256 digest for the latest version of `BasePlus`: F*AD0B78F94A6FD1C394999CBBC8DD16017FB06DFC3FA1F51AC17B43AC8F517432
[**Documentation for BasePlus**](./baseplus.md "Documentation for BasePlus")
diff --git a/baseplus.md b/baseplus.md
index b856736..4ac7656 100644
--- a/baseplus.md
+++ b/baseplus.md
@@ -50,13 +50,13 @@
* [`%LVarNm()` macro](#lvarnm-macro)
* [`%LVarNmLab()` macro](#lvarnmlab-macro)
* [`%bpPIPE()` macro](#bppipe-macro)
-
+ * [`%dirsAndFiles()` macro](#dirsandfiles-macro)
* [License](#license)
---
-# The BasePlus package [ver. 1.18.4] ###############################################
+# The BasePlus package [ver. 1.19.0] ###############################################
The **BasePlus** package implements useful
functions and functionalities I miss in the BASE SAS.
@@ -75,7 +75,8 @@ Kudos to all who inspired me to generate this package:
*Allan Bowe*,
*Anamaria Calai*,
*Michal Ludwicki*,
-*Quentin McMullen*.
+*Quentin McMullen*,
+*Kurt Bremser*.
Recording from the SAS Explore 2022 conference: [A BasePlus Package for SAS](https://communities.sas.com/t5/SAS-Explore-Presentations/A-BasePlus-Package-for-SAS/ta-p/838246 "A BasePlus Package for SAS") (September 27th-29th, 2022).
@@ -225,6 +226,11 @@ run;
%bpPIPE(ls -la ~/)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**EXAMPLE 13** Get list of all files and directories from `C:\SAS_WORK\`:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
---
Package contains:
@@ -233,56 +239,61 @@ Package contains:
3. macro deduplistp
4. macro deduplists
5. macro deduplistx
-6. macro functionexists
-7. macro getvars
-8. macro ldsn
-9. macro ldsnm
-10. macro lvarnm
-11. macro lvarnmlab
-12. macro qdeduplistx
-13. macro qgetvars
-14. macro qzipevalf
-15. macro raincloudplot
-16. macro symdelglobal
-17. macro unziplibrary
-18. macro zipevalf
-19. macro ziplibrary
-20. format bool
-21. format boolz
-22. format ceil
-23. format floor
-24. format int
-25. functions arrfill
-26. functions arrfillc
-27. functions arrmissfill
-28. functions arrmissfillc
-29. functions arrmisstoleft
-30. functions arrmisstoleftc
-31. functions arrmisstoright
-32. functions arrmisstorightc
-33. functions bracketsc
-34. functions bracketsn
-35. functions catxfc
-36. functions catxfi
-37. functions catxfj
-38. functions catxfn
-39. functions deldataset
-40. functions semicolonc
-41. functions semicolonn
-42. format brackets
-43. format semicolon
-44. proto qsortincbyprocproto
-45. functions frommissingtonumberbs
-46. functions fromnumbertomissing
-47. functions quicksort4notmiss
-48. functions quicksorthash
-49. functions quicksorthashsddv
-50. functions quicksortlight
+6. macro dirsandfiles
+7. macro functionexists
+8. macro getvars
+9. macro ldsn
+10. macro ldsnm
+11. macro lvarnm
+12. macro lvarnmlab
+13. macro qdeduplistx
+14. macro qgetvars
+15. macro qzipevalf
+16. macro raincloudplot
+17. macro symdelglobal
+18. macro unziplibrary
+19. macro zipevalf
+20. macro ziplibrary
+21. format bool
+22. format boolz
+23. format ceil
+24. format floor
+25. format int
+26. functions arrfill
+27. functions arrfillc
+28. functions arrmissfill
+29. functions arrmissfillc
+30. functions arrmisstoleft
+31. functions arrmisstoleftc
+32. functions arrmisstoright
+33. functions arrmisstorightc
+34. functions bracketsc
+35. functions bracketsn
+36. functions catxfc
+37. functions catxfi
+38. functions catxfj
+39. functions catxfn
+40. functions deldataset
+41. functions semicolonc
+42. functions semicolonn
+43. format brackets
+44. format semicolon
+45. proto qsortincbyprocproto
+46. functions frommissingtonumberbs
+47. functions fromnumbertomissing
+48. functions quicksort4notmiss
+49. functions quicksorthash
+50. functions quicksorthashsddv
+51. functions quicksortlight
-*SAS package generated by generatePackage, version 20221215*
+Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load it
+or look for the baseplus_AdditionalContent directory in the Packages fileref
+localization (only if additional content was deployed during the installation process).
+
+* SAS package generated by generatePackage, version 20230207 *
The SHA256 hash digest for package BasePlus:
-`A6F1977DC4EC22A39DDC7BCE68CF562AF54351A3D385D488EC3067B5A7C0F3CB`
+`F*AD0B78F94A6FD1C394999CBBC8DD16017FB06DFC3FA1F51AC17B43AC8F517432`
---
# Content description ############################################################################################
@@ -3975,6 +3986,149 @@ The basic syntax is the following, the `<...>` means optional parameters:
---
+## >>> `%dirsAndFiles()` macro: <<< #######################
+
+The `%dirsAndFiles()` macro allows to extract info about all files
+and subdirectories of a given `root` directory.
+
+The extracted info may be just a list of files and subdirectories or, if
+the `details=` parameter is set to 1, additional operating system information
+is extracted (information is OSS dependent and gives different results for Linux
+and for Windows)
+
+The extracted info can be narrowed down to files (`keepFiles=1`) or to
+directories (`keepDirs=1`) if need be.
+
+The extracted info can be presented in wide or long format (`longFormat=1`).
+
+The extracted info for files can be narrowed down to only files with particular
+extension, for example: `fileExt=sas7bdat`.
+
+The extracted info can be narrowed down maximal path depth
+by setting up the `maxDepth=` parameter.
+
+See examples below for the details.
+
+### REFERENCES: ###################################################################
+
+The macro is based on Kurt Bremser's "*Talking to Your Host*" article
+presented at WUSS 2022 conference.
+
+The article is available [here](https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344)
+and also as an additional content of this package.
+The paper was awarded the "Best Paper Award - Programming".
+
+### SYNTAX: ###################################################################
+
+The basic syntax is the following, the `<...>` means optional parameters:
+~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(
+ root
+ <,ODS=>
+ <,details=>
+ <,keepDirs=>
+ <,keepFiles=>
+ <,longFormat=>
+ <,fileExt=>
+ <,maxDepth=>
+)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+**Arguments description**:
+
+1. `root` - *Required*, path to be searched
+ for information.
+
+* `ODS=work.dirsAndFilesInfo` - *Optional*, output data set,
+ name of a dataset to store information.
+
+* `details=0` - *Optional*, indicates if detailed info
+ will be collected, `1` = yes, `0` = no.
+
+* `keepDirs=1` - *Optional*, indicates if directories info
+ will be collected, `1` = yes, `0` = no.
+
+* `keepFiles=1` - *Optional*, indicates if files info
+ will be collected, `1` = yes, `0` = no.
+
+* `longFormat=0` - *Optional*, indicates if output be
+ in long format, `1` = yes, `0` = no.
+
+* `fileExt=` - *Optional*, if not missing then indicates
+ file extension to filter out results.
+
+* `maxDepth=0` - *Optional*, if not zero then indicates
+ maximum depth of search in the root path.
+
+---
+
+### EXAMPLES AND USECASES: ####################################################
+
+**EXAMPLE 1.** Get list of files and directories:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 2.** Get detailed info:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result2,details=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 3.** Get only files info:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result3,keepDirs=0)
+
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result5,keepDirs=0,details=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 4.** Get only directories info:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result4,keepFiles=0)
+
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result6,keepFiles=0,details=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 5.** Filter out by `sas` extension:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(~/,ODS=work.result7,fileExt=sas)
+
+%dirsAndFiles(~/,ODS=work.result8,fileExt=sas,details=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 6.** Keep result in the long format:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(~/,ODS=work.result9,details=1,longFormat=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 7.** Get info for maximum depth of 2:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(C:\SAS_WORK\,ODS=work.result10,details=1,maxDepth=2)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 8.** How locked/unavailable files are handled:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(%sysfunc(pathname(WORK)),ODS=work.result11,details=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+**EXAMPLE 9.** Not existing directory:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
+%dirsAndFiles(%sysfunc(pathname(WORK))/noSuchDir,ODS=work.result12,details=1)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+
+
+
+---
## License ####################################################################
diff --git a/baseplus.zip b/baseplus.zip
index 1334c44..3aae7be 100644
Binary files a/baseplus.zip and b/baseplus.zip differ
diff --git a/hist/1.19.0/baseplus.zip b/hist/1.19.0/baseplus.zip
new file mode 100644
index 0000000..3aae7be
Binary files /dev/null and b/hist/1.19.0/baseplus.zip differ