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