Example #1
0
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());
                }
            }
        }
    }
}
Example #2
0
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);
}
Example #3
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);
  }
}