void FastOS_FileInterface::EmptyDirectory( const char *dir, const char *keepFile /* = nullptr */ ) { FastOS_StatInfo statInfo; if (!FastOS_File::Stat(dir, &statInfo)) return; // Fail if the directory does not exist FastOS_DirectoryScan dirScan( dir ); while (dirScan.ReadNext()) { if (strcmp(dirScan.GetName(), ".") != 0 && strcmp(dirScan.GetName(), "..") != 0 && (keepFile == nullptr || strcmp(dirScan.GetName(), keepFile) != 0)) { std::string name = dir; name += GetPathSeparator(); name += dirScan.GetName(); if (dirScan.IsDirectory()) { EmptyAndRemoveDirectory(name.c_str()); } else { if ( ! FastOS_File::Delete(name.c_str()) ) { std::ostringstream os; os << "Failed deleting file '" << name << "' due to " << getLastErrorString(); throw std::runtime_error(os.str().c_str()); } } } } }
int dirScan( const char* dir,int type, listItem* list ) { entity* fe; FILE* f; struct dirent *pent; struct stat st; char* buf=malloc(sizeof(char)*2048); DIR *pdir= opendir( dir ); if(pdir) { while( (pent=readdir(pdir)) ) { //We're not going to read hidden files or . / .. if(pent->d_name[0] != '.') { sprintf(buf, "%s/%s",dir,pent->d_name); if(stat(buf, &st)==0) { if( (st.st_mode&S_IFDIR)==S_IFDIR ) { if( type==TYPE_DIR) { fe = malloc( sizeof( entity ) ); fe->type=TYPE_DIR; fe->dataSize = 0; strcpy( fe->name, buf ); listAddData( list, (void*)fe ); } if(!dirScan( buf, type, list )) { return(0); } } else if( (st.st_mode&&S_IFREG)) { if( type== TYPE_FILE ) { fe = malloc( sizeof( entity ) ); fe->type=TYPE_FILE; strcpy( fe->name, buf ); f = fopen( buf, "rb" ); if(!f) { printf("Could not read file %s\n", buf); return(0); } fseek(f, 0L, SEEK_END); fe->dataSize = ftell(f); fseek(f, 0L, SEEK_SET); fe->data = malloc( fe->dataSize+strlen(fe->name) ); strcpy( fe->data, fe->name ); if( fread( (void*)(((char*)fe->data)+strlen(fe->name)), fe->dataSize, 1, f ) != 1 ) { printf("Could not read input data from file '%s'.\n", fe->name); return(0); } listAddData( list, (void*)fe ); } } else { printf("Bundles must only contain directories and regular files.\n"); return(0); } } } } return(1); } printf("Could not open directory: %s\n",dir); return(0); }
void bundle( const char* file, const char* inDir) { FILE* f; entity* e; listItem* entryList = initList(); listItem* it=entryList; bundleHeader_t header; bundleFileEntry* be; uint32_t dataOffset=0; header.version = bundleFileVersion; sprintf( header.ident, "%s", bundleFileIdentString ); char endMark[] = bundleFileEndMarkString; e = malloc(sizeof(entity) ); e->data=0; e->dataOffset=0; e->dataSize=0; strcpy( e->name, inDir ); e->type = TYPE_DIR; listAddData( entryList, (void*)e ); printf("Listing directories...\n"); if( dirScan( inDir, TYPE_DIR, entryList ) ) { header.numEntries = listSize(entryList); printf("Added %i directories.\n", header.numEntries ); printf("Listing files...\n"); if( dirScan( inDir, TYPE_FILE, entryList ) ) { printf("Added %i files.\n", (listSize(entryList)-header.numEntries) ); header.numEntries = listSize(entryList); printf("There are now %i entries.\n", header.numEntries); //First dataoffset is after the list of all entries dataOffset = sizeof(bundleHeader_t) + (sizeof(bundleFileEntry)*header.numEntries); printf("Bundling...\n"); f = fopen( file, "wb" ); if(f) { //Write header fwrite( (void*)(&header), sizeof(bundleHeader_t),1, f ); //Write entries while( (it=it->next) ) { e = (entity*)it->data; be = malloc( sizeof(bundleFileEntry) ); be->type = e->type; be->nameLen = strlen( e->name ); be->dataOffset = dataOffset; be->dataLen = e->dataSize; fwrite( (void*)be, sizeof(bundleFileEntry), 1, f ); dataOffset += be->dataLen+be->nameLen; free(be); } it=entryList; //Write file data while( (it=it->next) ) { e = (entity*)it->data; //Write file-name if( e->type == TYPE_DIR ) { fwrite( (void*)e->name, sizeof(char)*strlen(e->name), 1, f); printf("Added Dir: %s\n", e->name); } //If it's a file, write content if( e->type == TYPE_FILE ) { fwrite( e->data, e->dataSize+strlen(e->name), 1, f); printf("Added File: %s\n", e->name); } } fwrite( (void*)&endMark, strlen(endMark), 1, f ); fclose(f); } else { printf("Could not open outputfile %s for writing.\n", file); } } else { printf("fileScan of %s failed.\n", inDir); } } else { printf("dirScan of %s failed.\n", inDir); } }