Entering edit mode
I have a problem getting the h5dump function to work on a file for which I do not have write access. This example reproduces the error:
> library(rhdf5) > filename <- "x.hdf5" > stopifnot(!file.exists(filename)) > h5createFile(filename) [1] TRUE > h5write(LETTERS, file = filename, name = "/LETTERS") > h5dump(filename) ## works OK $LETTERS [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" > Sys.chmod(filename, mode = "0444") > h5dump(filename) ## throws an error HDF5-DIAG: Error detected in HDF5 (1.8.7) thread 0: #000: H5F.c line 1522 in H5Fopen(): unable to open file major: File accessability minor: Unable to open file #001: H5F.c line 1211 in H5F_open(): unable to open file: time = Thu Oct 23 14:33:11 2014 , name = 'x.hdf5', tent_flags = 1 major: File accessability minor: Unable to open file #002: H5FD.c line 1086 in H5FD_open(): open failed major: Virtual File Layer minor: Unable to initialize object #003: H5FDsec2.c line 348 in H5FD_sec2_open(): unable to open file: name = 'x.hdf5', errno = 13, error message = 'Permission denied', flags = 1, o_flags = 2 major: File accessability minor: Unable to open file HDF5: unable to open file Error in h5checktypeOrOpenLoc(file) : Error in h5checktypeOrOpenLoc(). File 'x.hdf5' is not a valid HDF5 file. > unlink(filename) > sessionInfo() R version 3.1.0 Patched (2014-05-17 r65643) Platform: x86_64-apple-darwin10.8.0 (64-bit) locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] rhdf5_2.10.0 loaded via a namespace (and not attached): [1] zlibbioc_1.11.1
I believe a simple fix would be to modify the first line of the h5dump
function. Instead of
loc = h5checktypeOrOpenLoc(file)
it should be
loc = h5checktypeOrOpenLoc(file, readonly = TRUE)
In fact that is how the h5ls()
function starts.
In the meantime, this would be a workaround:
fid <- H5Fopen(filename, flags = "H5F_ACC_RDONLY") on.exit(H5Fclose(fid)) h5dump(fid)