xref: /petsc/src/sys/fileio/fdir.c (revision 6b593349805f9e24beeeed737818f3ae25b88fba)
197540f07SSatish Balay #include <petscsys.h>
297540f07SSatish Balay #include <direct.h>
397540f07SSatish Balay #include <io.h>
497540f07SSatish Balay #if defined (PETSC_HAVE_STDINT_H)
597540f07SSatish Balay #include <stdint.h>
697540f07SSatish Balay #endif
797540f07SSatish Balay 
897540f07SSatish Balay #undef __FUNCT__
997540f07SSatish Balay #define __FUNCT__ "PetscPathJoin"
1097540f07SSatish Balay PetscErrorCode PetscPathJoin(const char dname[],const char fname[],size_t n,char fullname[])
1197540f07SSatish Balay {
1297540f07SSatish Balay   PetscErrorCode ierr;
1397540f07SSatish Balay   size_t l1,l2;
1497540f07SSatish Balay   PetscFunctionBegin;
1597540f07SSatish Balay   ierr = PetscStrlen(dname,&l1);CHKERRQ(ierr);
1697540f07SSatish Balay   ierr = PetscStrlen(fname,&l2);CHKERRQ(ierr);
1797540f07SSatish Balay   if ((l1+l2+2)>n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Path length is greater than buffer size");
1897540f07SSatish Balay   ierr = PetscStrcpy(fullname,dname);CHKERRQ(ierr);
1997540f07SSatish Balay   ierr = PetscStrcat(fullname,"/");CHKERRQ(ierr);
2097540f07SSatish Balay   ierr = PetscStrcat(fullname,fname);CHKERRQ(ierr);
2197540f07SSatish Balay   PetscFunctionReturn(0);
2297540f07SSatish Balay }
2397540f07SSatish Balay 
2497540f07SSatish Balay #undef __FUNCT__
2597540f07SSatish Balay #define __FUNCT__ "PetscMkdir"
2697540f07SSatish Balay PetscErrorCode PetscMkdir(const char dir[])
2797540f07SSatish Balay {
2897540f07SSatish Balay   PetscFunctionBegin;
2997540f07SSatish Balay   if(_mkdir(dir)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not create dir: %s",dir);
3097540f07SSatish Balay      PetscFunctionReturn(0);
3197540f07SSatish Balay }
3297540f07SSatish Balay 
3397540f07SSatish Balay #undef __FUNCT__
3497540f07SSatish Balay #define __FUNCT__ "PetscRMTree"
3597540f07SSatish Balay PetscErrorCode PetscRMTree(const char dir[])
3697540f07SSatish Balay {
3797540f07SSatish Balay   PetscErrorCode ierr;
3897540f07SSatish Balay   struct _finddata_t data;
3997540f07SSatish Balay   char loc[PETSC_MAX_PATH_LEN];
4097540f07SSatish Balay   PetscBool flg1, flg2;
4197540f07SSatish Balay #if defined (PETSC_HAVE_STDINT_H)
4297540f07SSatish Balay   intptr_t handle;
4397540f07SSatish Balay #else
4497540f07SSatish Balay   long handle;
4597540f07SSatish Balay   #endif
4697540f07SSatish Balay 
4797540f07SSatish Balay   PetscFunctionBegin;
4897540f07SSatish Balay   ierr = PetscPathJoin(dir,"*",PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr);
4997540f07SSatish Balay   handle = _findfirst(loc, &data);
50*6b593349SSatish Balay   if(handle == -1) {
51*6b593349SSatish Balay     PetscBool flg;
52*6b593349SSatish Balay     ierr = PetscTestDirectory(loc,'r',&flg);CHKERRQ(ierr);
53*6b593349SSatish Balay     if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Cannot access directory to delete: %s",dir);
54*6b593349SSatish Balay     ierr = PetscTestFile(loc,'r',&flg);CHKERRQ(ierr);
55*6b593349SSatish Balay     if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Specified path is a file - not a dir: %s",dir);
56*6b593349SSatish Balay     PetscFunctionReturn(0); /* perhaps the dir was not yet created */
57*6b593349SSatish Balay   }
5897540f07SSatish Balay   while(_findnext(handle, &data) != -1) {
5997540f07SSatish Balay     ierr = PetscStrcmp(data.name, ".",&flg1);CHKERRQ(ierr);
6097540f07SSatish Balay     ierr = PetscStrcmp(data.name, "..",&flg2);CHKERRQ(ierr);
6197540f07SSatish Balay     if (flg1 || flg2) continue;
6297540f07SSatish Balay     ierr = PetscPathJoin(dir,data.name,PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr);
6397540f07SSatish Balay     if(data.attrib & _A_SUBDIR) {
6497540f07SSatish Balay       ierr = PetscRMTree(loc);CHKERRQ(ierr);
6597540f07SSatish Balay     } else{
6697540f07SSatish Balay       if (remove(loc)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete file: %s",loc);
6797540f07SSatish Balay     }
6897540f07SSatish Balay   }
6997540f07SSatish Balay   _findclose(handle);
7097540f07SSatish Balay   if (_rmdir(dir)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete dir: %s",dir);
7197540f07SSatish Balay   PetscFunctionReturn(0);
7297540f07SSatish Balay }
7397540f07SSatish Balay 
7497540f07SSatish Balay 
75