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