'FILE1' 'FILE2' -------------------- -------------------- ! ! ! ! ! / ! ! / ! ! | ! ! | ! ! | ! ! | ! ! V ! ! V ! ! -------- ! ! ---------- ! ! ! Group ! ! ! ! Dataset! ! ! --------- ! ! ---------- ! !------------------! !------------------!After mounting the second file, 'FILE2', under the group in the file, 'FILE1', the parent has the following structure:
'FILE1' -------------------- ! ! ! / ! ! | ! ! | ! ! V ! ! -------- ! ! ! Group ! ! ! --------- ! ! | ! ! | ! ! V ! ! ----------- ! ! ! Dataset ! ! ! !---------- ! ! ! !------------------![ Download h5_mount.c ]
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include<hdf5.h> #define FILE1 "mount1.h5" #define FILE2 "mount2.h5" #define RANK 2 #define NX 4 #define NY 5 int main(void) { hid_t fid1, fid2, gid; /* Files and group identifiers */ hid_t did, tid, sid; /* Dataset and datatype identifiers */ herr_t status; hsize_t dims[] = {NX,NY}; /* Dataset dimensions */ int i, j; int bm[NX][NY], bm_out[NX][NY]; /* Data buffers */ /* * Initialization of buffer matrix "bm" */ for(i =0; i < NX; i++) { for(j = 0; j < NY; j++) bm[i][j] = i + j; } /* * Create first file and a group in it. */ fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); gid = H5Gcreate(fid1, "/G", 0); /* * Close group and file */ H5Gclose(gid); H5Fclose(fid1); /* * Create second file and dataset "D" in it. */ fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); dims[0] = NX; dims[1] = NY; sid = H5Screate_simple(RANK, dims, NULL); did = H5Dcreate(fid2, "D", H5T_NATIVE_INT, sid, H5P_DEFAULT); /* * Write data to the dataset. */ status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm); /* * Close all identifiers. */ H5Sclose(sid); H5Dclose(did); H5Fclose(fid2); /* * Reopen both files */ fid1 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); fid2 = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Mount second file under G in the first file. */ H5Fmount(fid1, "/G", fid2, H5P_DEFAULT); /* * Access dataset D in the first file under /G/D name. */ did = H5Dopen(fid1,"/G/D"); tid = H5Dget_type(did); status = H5Dread(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm_out); /* * Print out the data. */ for(i=0; i < NX; i++){ for(j=0; j < NY; j++) printf(" %d", bm_out[i][j]); printf("\n"); } /* * Close all identifers */ H5Tclose(tid); H5Dclose(did); /* * Unmounting second file */ H5Funmount(fid1, "/G"); /* * Close both files */ H5Fclose(fid1); H5Fclose(fid2); return 0; } ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
herr_t H5Fmount(hid_t loc_id, const char *name, hid_t file_id, hid_t plist_id)
Below is a description of another scenario:
Suppose group G was a member of group D in the first file (fid1).
Then mounting point G can be specified in two different ways:
herr_t H5Funmount(hid_t loc_id, const char *name)Arguments to this function specify the location of the "mount point". In our example loc_id is an identifier of the first file, and name is the name of group G, "/G". One could also use "G" instead of "/G" since G is a member of the root group in the file fid1. Notice that H5Funmount does not close files. They are closed with the respective calls to the H5Fclose function. Closing the parent automatically unmounts the child.