working with file_images

Hi,

we are trying to use file_images in our app to reduce time and optimize some part of code.
However we succefully create file_image from existing on disc file. next we make modification of attributes and other data.
On end we want to save this data stored in file_image to disc and this doesn`t work.
Our purpose is to create file in memory (file_image), then when user is doing actions in our app, this data is modified many times.
However when user finish to work with loaded file we want to save it back into the file on disc.

Below i give example code we use.
There must be something we do wrong. Or maybe this can`t be done this way ?
Thanks for any ideas and answers.

int main()
{

     std::wstring filename("some path to file on disc");

     //// reading file to buffer with standard winapi way
     HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
     if (hFile == INVALID_HANDLE_VALUE)
         return -1;
      int buffer_size = GetFileSize(hFile, NULL);
      char* buffer = new char[buffer_size];
      DWORD bytesReaded = 0;
     ReadFile(hFile, buffer, buffer_size, &bytesReaded, 0);
     CloseHandle(hFile);

     //// creating image from given readed buffer
     unsigned flags = H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE | H5LT_FILE_IMAGE_OPEN_RW;
     hid_t fileid = H5LTopen_file_image(buffer, buffer_size, flags);

     //// bind image with file to modify attributes
     H5::H5File h5file;
     h5file.setId(fileid);
     {
         H5::Group root = h5file.openGroup("/");
         H5::Attribute a = root.openAttribute("SomeImportantAttrib");

         size_t size = a.getStorageSize();
         H5::StrType dtString(H5::PredType::C_S1, size);
         dtString.setCset(H5T_CSET_UTF8);

         std::string value(size, '\0');
         a.read(dtString, value); // on start this produce value = "val1"

         std::string valueR = "val2";
         dtString.setSize(valueR.length());
         a.write(dtString, valueR.c_str()); //this goes ok

         size_t size2 = a.getStorageSize();
         dtString.setSize(size2);
         std::string value2(size2, '\0');
         a.read(dtString, value2); // this produce value2 = "val2" - so it is ok

         H5::Attribute a2 = root.createAttribute("testAttr", dtString, H5::DataSpace());
         a2.write(dtString, "newAttrInGroup");

         root.close();
     }

     //// getting buffer and size after modifications
     int buffer_size2 = H5Fget_file_image(h5file.getId(), 0, 0);
     char* buffer2 = new char[buffer_size2];
     int result2 = H5Fget_file_image(fileid, buffer2, buffer_size2);

     //// writing buffer to disc with standard winapi way
     std::string filename2("some other path to file on disc");
     std::vector< wchar_t > wfilename(strlen(filename2.c_str()) + 1);
     MultiByteToWideChar(CP_UTF8, 0, filename2.c_str(), -1, &wfilename[0], wfilename.size());
     HANDLE hFile2 = CreateFile(&wfilename[0], GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     if (hFile2 == INVALID_HANDLE_VALUE)
         return -1;
     DWORD bytesWrited = 0;
     WriteFile(hFile2, buffer2, buffer_size2, &bytesWrited, 0);
     CloseHandle(hFile2);

     return 0;
}

Hi,

···

On Dec 10, 2015, at 2:34 AM, arturkolacz@ortosoft.eu<mailto:arturkolacz@ortosoft.eu> wrote:

Hi,

we are trying to use file_images in our app to reduce time and optimize some part of code.
However we succefully create file_image from existing on disc file. next we make modification of attributes and other data.
On end we want to save this data stored in file_image to disc and this doesn`t work.
Our purpose is to create file in memory (file_image), then when user is doing actions in our app, this data is modified many times.
However when user finish to work with loaded file we want to save it back into the file on disc.

May be you figured it our already :slight_smile: If you need to work with an HDF5 file in memory and then save it to the disk, please use a core driver (see H5Pset_fapl_core<https://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplCore>). File image feature was designed to work with files in memory only.

Elena

Below i give example code we use.
There must be something we do wrong. Or maybe this can`t be done this way ?
Thanks for any ideas and answers.

int main()
{

   std::wstring filename("some path to file on disc");

   //// reading file to buffer with standard winapi way
   HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ | GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
   if (hFile == INVALID_HANDLE_VALUE)
       return -1;
    int buffer_size = GetFileSize(hFile, NULL);
    char* buffer = new char[buffer_size];
    DWORD bytesReaded = 0;
   ReadFile(hFile, buffer, buffer_size, &bytesReaded, 0);
   CloseHandle(hFile);

   //// creating image from given readed buffer
   unsigned flags = H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE | H5LT_FILE_IMAGE_OPEN_RW;
   hid_t fileid = H5LTopen_file_image(buffer, buffer_size, flags);

   //// bind image with file to modify attributes
   H5::H5File h5file;
   h5file.setId(fileid);
   {
       H5::Group root = h5file.openGroup("/");
       H5::Attribute a = root.openAttribute("SomeImportantAttrib");

       size_t size = a.getStorageSize();
       H5::StrType dtString(H5::PredType::C_S1, size);
       dtString.setCset(H5T_CSET_UTF8);

       std::string value(size, '\0');
       a.read(dtString, value); // on start this produce value = "val1"

       std::string valueR = "val2";
       dtString.setSize(valueR.length());
       a.write(dtString, valueR.c_str()); //this goes ok

       size_t size2 = a.getStorageSize();
       dtString.setSize(size2);
       std::string value2(size2, '\0');
       a.read(dtString, value2); // this produce value2 = "val2" - so it is ok

       H5::Attribute a2 = root.createAttribute("testAttr", dtString, H5::DataSpace());
       a2.write(dtString, "newAttrInGroup");

       root.close();
   }

   //// getting buffer and size after modifications
   int buffer_size2 = H5Fget_file_image(h5file.getId(), 0, 0);
   char* buffer2 = new char[buffer_size2];
   int result2 = H5Fget_file_image(fileid, buffer2, buffer_size2);

   //// writing buffer to disc with standard winapi way
   std::string filename2("some other path to file on disc");
   std::vector< wchar_t > wfilename(strlen(filename2.c_str()) + 1);
   MultiByteToWideChar(CP_UTF8, 0, filename2.c_str(), -1, &wfilename[0], wfilename.size());
   HANDLE hFile2 = CreateFile(&wfilename[0], GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
   if (hFile2 == INVALID_HANDLE_VALUE)
       return -1;
   DWORD bytesWrited = 0;
   WriteFile(hFile2, buffer2, buffer_size2, &bytesWrited, 0);
   CloseHandle(hFile2);

   return 0;
}

_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@lists.hdfgroup.org<mailto:Hdf-forum@lists.hdfgroup.org>
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5