xref: /petsc/src/sys/fileio/fdir.c (revision 9085eb00fd4cedd8050c82cf211223a28e1b3920)
1 #include <petscsys.h>
2 #include <direct.h>
3 #include <io.h>
4 #if defined (PETSC_HAVE_STDINT_H)
5 #include <stdint.h>
6 #endif
7 
8 #undef __FUNCT__
9 #define __FUNCT__ "PetscPathJoin"
10 PetscErrorCode PetscPathJoin(const char dname[],const char fname[],size_t n,char fullname[])
11 {
12   PetscErrorCode ierr;
13   size_t l1,l2;
14   PetscFunctionBegin;
15   ierr = PetscStrlen(dname,&l1);CHKERRQ(ierr);
16   ierr = PetscStrlen(fname,&l2);CHKERRQ(ierr);
17   if ((l1+l2+2)>n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Path length is greater than buffer size");
18   ierr = PetscStrcpy(fullname,dname);CHKERRQ(ierr);
19   ierr = PetscStrcat(fullname,"/");CHKERRQ(ierr);
20   ierr = PetscStrcat(fullname,fname);CHKERRQ(ierr);
21   PetscFunctionReturn(0);
22 }
23 
24 #undef __FUNCT__
25 #define __FUNCT__ "PetscMkdir"
26 PetscErrorCode PetscMkdir(const char dir[])
27 {
28   PetscFunctionBegin;
29   if(_mkdir(dir)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not create dir: %s",dir);
30      PetscFunctionReturn(0);
31 }
32 
33 #undef __FUNCT__
34 #define __FUNCT__ "PetscRMTree"
35 PetscErrorCode PetscRMTree(const char dir[])
36 {
37   PetscErrorCode ierr;
38   struct _finddata_t data;
39   char loc[PETSC_MAX_PATH_LEN];
40   PetscBool flg1, flg2;
41 #if defined (PETSC_HAVE_STDINT_H)
42   intptr_t handle;
43 #else
44   long handle;
45   #endif
46 
47   PetscFunctionBegin;
48   ierr = PetscPathJoin(dir,"*",PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr);
49   handle = _findfirst(loc, &data);
50   if(handle == -1) {
51     PetscBool flg;
52     ierr = PetscTestDirectory(loc,'r',&flg);CHKERRQ(ierr);
53     if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Cannot access directory to delete: %s",dir);
54     ierr = PetscTestFile(loc,'r',&flg);CHKERRQ(ierr);
55     if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Specified path is a file - not a dir: %s",dir);
56     PetscFunctionReturn(0); /* perhaps the dir was not yet created */
57   }
58   while(_findnext(handle, &data) != -1) {
59     ierr = PetscStrcmp(data.name, ".",&flg1);CHKERRQ(ierr);
60     ierr = PetscStrcmp(data.name, "..",&flg2);CHKERRQ(ierr);
61     if (flg1 || flg2) continue;
62     ierr = PetscPathJoin(dir,data.name,PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr);
63     if(data.attrib & _A_SUBDIR) {
64       ierr = PetscRMTree(loc);CHKERRQ(ierr);
65     } else{
66       if (remove(loc)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete file: %s",loc);
67     }
68   }
69   _findclose(handle);
70   if (_rmdir(dir)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete dir: %s",dir);
71   PetscFunctionReturn(0);
72 }
73 
74 
75