Here is a stored procedure I wrote that will check for the existence of a folder, create it if it does not exist, or tell you if it cannot create it. UNCs, relative paths and full mapped drive paths all work. It is self-documenting. You can also call it without a filename or with /? for help.
--- dchkdir.prc stored procedure to check for the existence of a directory,
--- and make it if not found
--- 05/17/04 Emmitt Dove/Blue Ridge Paper Products, Inc.
---
--- usage: set var vx INTEGER = (call dchkdir(.vdirname)) where vdirname is
--- the name of the directory to create if it does not exist
---
--- note: unc, absolute and relative pathnames acceptable
---
--- note: if only checking for the existence of a directory, use (chkfile())
--- built-in function
---
--- to create the stored procedure do this:
---
--- PUT dchkdir.prc AS dchkdir pdirname TEXT RETURN INTEGER +
--- COMMENT 'Directory check/make'
---
--- directory name will be in variable pdirname
---
--- procedure will return 1 if successful or directory already exists, 0 if
--- directory does not exist and could not be created
-- if help was requested or invalid input:
IF pdirname = (CHAR(32)) OR pdirname = '/?' OR pdirname IS NULL OR pdirname = '' THEN
SET VAR pmsg ='Procedure: dchkdir - check for existence of a directory'
SET VAR pmsg = (CTXT(.pmsg)&CTXT('and create')+CHAR(013))
SET VAR pmsg = (CTXT(.pmsg)&CTXT(' it if not found')+
+CHAR(013)+CHAR(013))
SET VAR pmsg = (CTXT(.pmsg)+CTXT('Usage: SET VAR vx INTEGER = (CALL')+
&CTXT('dchkdir(dirname))')+CHAR(013))
SET VAR pmsg = (CTXT(.pmsg)&CTXT(' where "dirname" is the name')+
&CTXT('of the directory to create')+CHAR(013)+CHAR(013))
SET VAR pmsg = (CTXT(.pmsg)+CTXT('Return: 0 = directory not found')+
&CTXT('and could not be created')+CHAR(013))
SET VAR pmsg = (CTXT(.pmsg)+CTXT('Return: 1 = directory found or')+
&CTXT('created'))
-- which version of R:Base are we running?
SET VAR pversion = (CVAL('version'))
SET VAR pversion = (SSUB(.pversion,3))
IF (SGET(.pversion,1,9)) = '7' THEN
PAUSE 2 USING .pmsg +
CAPTION 'Stored Procedure dchkdir Help' BUTTON 'OK' +
OPTION ICON_FILE icons\information.bmp|BACK_COLOR 8404992|+
MESSAGE_COLOR 8404992|MESSAGE_FONT_COLOR 16777215|+
BUTTON_COLOR 16747804|BUTTON_FONT_COLOR 16777215
ELSE
PAUSE 2 USING .pmsg=80
ENDIF
CLEAR VAR p%
RETURN 1
ENDIF
-- first test for existence
SET VAR pexist INTEGER = (CHKFILE(.pdirname))
IF pexist = 1 THEN
-- directory already exists
CLEAR VAR p%
RETURN 1
ENDIF
SET VAR pcmd = (CTXT('mkdir')&CTXT(.pdirname))
&pcmd
SET VAR pexist INTEGER = (CHKFILE(.pdirname))
IF pexist = 1 THEN
-- directory successfully created
CLEAR VAR p%
RETURN 1
ENDIF
-- directory not created; are there backslashes in the path other than
-- the first two characters? If so, pick the path apart and make each
-- subsequent directory
SET VAR pexist INTEGER = (SLOC(.pdirname,'\'))
IF pexist = 0 THEN
-- no backslashes; cannot do
RETURN 0
ENDIF
-- are the first or third characters a backslash?
IF pexist = 1 THEN
-- first is a backslash; is the second?
SET VAR ptest = (SGET(.pdirname,1,2))
IF ptest = '\' THEN
-- pdirname starts as a unc name; need to find position of second
-- following backslash since first part of unc name is server name and
-- second part is share name; cannot create directory which is server name
-- or share name
SET VAR ploc = 2
SET VAR plen = (SLEN(.pdirname))
SET VAR psuccess INTEGER = 1
SET VAR pcount INTEGER = 0
WHILE ploc < .plen THEN
SET VAR ploc = (.ploc + 1)
SET VAR ptest = (SGET(.pdirname,1,.ploc))
IF ptest = '\' THEN
IF pcount = 0 THEN
-- found first; this delimts server name
SET VAR pcount = 1
ELSE
-- found second occurrence after leading backslashes; this delimts
-- share name; set starting position one more
SET VAR pstartpos = (.ploc + 1)
BREAK
ENDIF
ENDIF
IF ploc = .plen THEN
-- got through entire unc without another backslash; invalid
-- entry
SET VAR psuccess INTEGER = 0
BREAK
ENDIF
ENDWHILE
IF psuccess = 0 THEN
RETURN 0
ENDIF
ELSE
-- only first character is a backslash;
SET VAR pstartpos = 2
ENDIF
ELSE
IF pexist = 3 THEN
-- third character is a backslash; is second a colon?
SET VAR ptest = (SGET(.pdirname,1,2))
IF ptest = ':' THEN
-- we apparently have a drive spec included
SET VAR pstartpos = 4
ELSE
SET VAR pstartpos = 1
ENDIF
ELSE
SET VAR pstartpos = 1
ENDIF
ENDIF
SET VAR ploc INTEGER = (.pstartpos - 1)
SET VAR plen = (SLEN(.pdirname))
SET VAR psuccess INTEGER = 1
WHILE ploc < .plen THEN
SET VAR ploc = (.ploc + 1)
SET VAR ptest = (SGET(.pdirname,1,.ploc))
IF ptest = '\' OR ploc = .plen THEN
-- backslash found; try creating directory to one less than position
-- unless loc = len
IF ploc = .plen THEN
SET VAR pdir = .pdirname
ELSE
SET VAR pdir = (SGET(.pdirname,(.ploc - 1),1))
ENDIF
SET VAR pexist INTEGER = (CHKFILE(.pdir))
IF pexist = 0 THEN
SET VAR pcmd = (CTXT('mkdir')&CTXT(.pdir))
&pcmd
SET VAR pexist INTEGER = (CHKFILE(.pdir))
IF pexist = 0 THEN
-- couldn't make directory
SET VAR psuccess = 0
BREAK
ENDIF
ENDIF
ENDIF
ENDWHILE
IF psuccess = 0 THEN
-- could not make directory
CLEAR VAR p%
RETURN 0
ENDIF
CLEAR VAR p%
RETURN 1
Can someone suggest a reliable way to check for the existence of a folder on a network?
I have been using (checkfile(filename)) to perform this test on the local machine. In this scenario, if filename is the name of a folder (such as C:\BobFolder) then the checkfile command will return 1 if the folder already exists.
However, when using this technique against a server folder using UNC (such as \\Server1\BobFolder) the checkfile command always seems to return 0 indicating that the folder does not exist.
Thanks.
Bob
Manager, DairyPak Business Systems
Blue Ridge Paper Products, Inc.
40 Lindeman Drive
Trumbull, CT 06611
(203) 673-2231
[EMAIL PROTECTED]
[EMAIL PROTECTED]
