From 137bcd5810c49fcecd75f4d51f2043f55c3a96f2 Mon Sep 17 00:00:00 2001 From: Jeffrey Armstrong Date: Wed, 14 Apr 2021 11:18:49 -0400 Subject: Added Windows support for getting directory and file listings --- common/utilities.F90 | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) (limited to 'common/utilities.F90') diff --git a/common/utilities.F90 b/common/utilities.F90 index 981dee3..0c659ac 100644 --- a/common/utilities.F90 +++ b/common/utilities.F90 @@ -285,21 +285,36 @@ contains tempfile => generate_temporary_filename() res => null() - + +#ifdef WINDOWS + call execute_command_line("dir /b/ad-h"//trim(directory)//" > "//trim(tempfile), & + wait=.true.) +#else call execute_command_line("ls -l "//trim(directory)//" > "//trim(tempfile), & wait=.true.) +#endif open(newunit=unum, file=tempfile, action='read') - + +#ifndef WINDOWS ! First line is "total ###" read(unum, '(A)', iostat=ierr) line - +#endif + dcount = 0 read(unum, '(A)', iostat=ierr) line do while(ierr == 0) + +#ifdef WINDOWS + if(len_trim(line) > 0) then + dcount = dcount + 1 + end if +#else if(line(1:1) == 'd') then dcount = dcount + 1 end if +#endif + read(unum, '(A)', iostat=ierr) line end do @@ -308,9 +323,13 @@ contains if(dcount > 0) then allocate(res(dcount)) + ! Windows is all set, don't call anything +#ifndef WINDOWS ! Now call ls, but group directories first call execute_command_line("ls --group-directories-first "//trim(directory)//" > "//trim(tempfile), & wait=.true.) +#endif + open(newunit=unum, file=tempfile, action='read') i = 0 read(unum, '(A)', iostat=ierr) line @@ -338,9 +357,14 @@ contains tempfile => generate_temporary_filename() res => null() - + +#ifdef WINDOWS + call execute_command_line("dir /b/a-d-h"//trim(directory)//" > "//trim(tempfile), & + wait=.true.) +#else call execute_command_line("ls -l "//trim(directory)//" > "//trim(tempfile), & wait=.true.) +#endif open(newunit=unum, file=tempfile, action='read') @@ -350,13 +374,15 @@ contains ! Count directories first read(unum, '(A)', iostat=ierr) line do while(ierr == 0) - + +#ifndef WINDOWS if(line(1:1) == 'd') then dcount = dcount + 1 end if - +#endif + ! ls puts a nonsense entry first. harmless, but we don't want it - if(line(1:6) /= "total ") then + if(line(1:6) /= "total " .and. len_trim(line) > 0) then total_count = total_count + 1 end if @@ -372,9 +398,13 @@ contains allocate(res(n)) !print *, "Size: ", size(res) + ! We don't need to recreate the file on Windows. It's fine. +#ifndef WINDOWS ! Now call ls, but group directories first call execute_command_line("ls --group-directories-first "//trim(directory)//" > "//trim(tempfile), & wait=.true.) +#endif + open(newunit=unum, file=tempfile, action='read') i = 0 -- cgit v1.2.3