Skip to content

Commit 1224b72

Browse files
committed
hdf5: remove 'isfile' to allow passing through remote URLs e.g. S3
hdf5: remove 'isfolder' to allow passing through remote URLs e.g. S3
1 parent 4597868 commit 1224b72

File tree

11 files changed

+119
-122
lines changed

11 files changed

+119
-122
lines changed

+stdlib/+fileio/md5sum.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import stdlib.fileio.expanduser
88

99
file = expanduser(file);
10-
assert(isfile(file), '%s not found', file)
1110

1211
if ismac
1312
[stat,hash] = system("md5 -r " + file);

+stdlib/+fileio/posix.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
function ppath = posix(varargin)
22
% convert a path or sequence of path components to a Posix path separated
33
% with "/" even on Windows.
4-
% If Windows path also have escaping "\" this breaks--this is fixable by
5-
% regex so let us know if this becomes an issue.
4+
% If Windows path also have escaping "\" this breaks
65

76
ppath = fullfile(varargin{:});
87

+stdlib/+fileio/sha256sum.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import stdlib.fileio.expanduser
88

99
file = expanduser(file);
10-
assert(isfile(file), '%s not found', file)
1110

1211
if ismac
1312
[stat,hash] = system("shasum --algorithm 256 --binary " + file);

+stdlib/+hdf5nc/h5create_group.m

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616
fid = file;
1717
else
1818
file = expanduser(file);
19-
if isfile(file)
20-
dcpl = 'H5P_DEFAULT';
19+
dcpl = 'H5P_DEFAULT';
20+
try
2121
fid = H5F.open(file, 'H5F_ACC_RDWR', dcpl);
22-
else
23-
fid = H5F.create(file);
22+
catch e
23+
if e.identifier == "MATLAB:imagesci:hdf5io:resourceNotFound"
24+
fid = H5F.create(file);
25+
else
26+
rethrow(e)
27+
end
2428
end
2529
end
2630

+stdlib/+hdf5nc/h5save.m

Lines changed: 8 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -23,79 +23,22 @@ function h5save(filename, varname, A, opts)
2323
% coerce if needed
2424
A = coerce_ds(A, opts.type);
2525

26-
if isfile(filename) && h5exists(filename, varname)
27-
exist_file(filename, varname, A, opts.size)
28-
else
29-
new_file(filename, varname, A, opts.size)
30-
end
31-
32-
end % function
33-
34-
35-
function exist_file(filename, varname, A, sizeA)
36-
37-
import stdlib.hdf5nc.h5size
38-
39-
diskshape = h5size(filename, varname);
40-
if length(diskshape) >= 2
41-
% start is always a row vector, regardless of shape of array
42-
start = ones(1,ndims(A));
43-
elseif ~isempty(diskshape)
44-
start = 1;
45-
end
46-
47-
if isempty(sizeA)
48-
sizeA = defaultSize(A);
49-
end
50-
51-
if isscalar(A)
52-
h5write(filename, varname, A)
53-
elseif all(diskshape == sizeA)
54-
h5write(filename, varname, A, start, count=sizeA)
55-
elseif all(diskshape == fliplr(sizeA))
56-
h5write(filename, varname, A.', start, count=fliplr(sizeA))
57-
else
58-
error('hdf5nc:h5save:value_error', ['shape of ',varname,': ', int2str(sizeA), ' does not match existing HDF5 shape ', int2str(diskshape)])
59-
end
60-
61-
end % function
62-
63-
64-
function new_file(filename, varname, A, sizeA)
65-
66-
67-
folder = fileparts(filename);
68-
if strlength(folder) > 0 && ~isfolder(folder)
69-
error('hdf5nc:h5save:fileNotFound', '%s is not a folder, cannot create %s', folder, filename)
70-
end
71-
72-
if isempty(sizeA)
73-
if isscalar(A)
74-
h5_write_scalar(filename, varname, A)
75-
return
76-
elseif isvector(A)
77-
h5create(filename, varname, length(A), Datatype=class(A))
26+
try
27+
if h5exists(filename, varname)
28+
h5_exist_file(filename, varname, A, opts.size)
7829
else
79-
create_compress(filename, varname, A, size(A))
30+
h5_new_file(filename, varname, A, opts.size)
8031
end
81-
else
82-
if isscalar(sizeA)
83-
if sizeA == 0
84-
h5_write_scalar(filename, varname, A)
85-
return
86-
else
87-
h5create(filename, varname, sizeA, Datatype=class(A))
88-
end
32+
catch e
33+
if e.identifier == "MATLAB:imagesci:hdf5io:resourceNotFound"
34+
h5_new_file(filename, varname, A, opts.size)
8935
else
90-
create_compress(filename, varname, A, sizeA)
36+
rethrow(e)
9137
end
9238
end
9339

94-
h5write(filename, varname, A)
95-
9640
end % function
9741

98-
9942
% Copyright 2020 Michael Hirsch
10043

10144
% Licensed under the Apache License, Version 2.0 (the "License");

+stdlib/+hdf5nc/ncsave.m

Lines changed: 12 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -49,56 +49,20 @@ function ncsave(filename, varname, A, opts)
4949
% coerce if needed
5050
A = coerce_ds(A, opts.type);
5151

52-
if isfile(filename) && ncexists(filename, varname)
53-
exist_file(filename, varname, A, sizeA)
54-
else
55-
new_file(filename, varname, A, sizeA, ncdims)
56-
end
57-
58-
end % function
59-
60-
61-
function exist_file(filename, varname, A, sizeA)
62-
63-
import stdlib.hdf5nc.ncsize
64-
65-
diskshape = ncsize(filename, varname);
66-
67-
if all(diskshape == sizeA)
68-
ncwrite(filename, varname, A)
69-
elseif all(diskshape == fliplr(sizeA))
70-
ncwrite(filename, varname, A.')
71-
else
72-
error('hdf5nc:ncsave:value_error', ['shape of ',varname,': ', int2str(sizeA), ' does not match existing NetCDF4 shape ', int2str(diskshape)])
73-
end
74-
75-
end % function
76-
77-
78-
function new_file(filename, varname, A, sizeA, ncdims)
79-
import stdlib.hdf5nc.auto_chunk_size
80-
81-
folder = fileparts(filename);
82-
if strlength(folder) > 0 && ~isfolder(folder)
83-
error('hdf5nc:ncsave:fileNotFound', '%s is not a folder, cannot create %s', folder, filename)
84-
end
85-
86-
if isscalar(A)
87-
nccreate(filename, varname, Datatype=class(A), Format='netcdf4')
88-
elseif isvector(A)
89-
nccreate(filename, varname, Dimensions=ncdims, Datatype=class(A), Format='netcdf4')
90-
else
91-
% enable Gzip compression--remember Matlab's dim order is flipped from
92-
% C / Python
93-
nccreate(filename, varname, Dimensions=ncdims, ...
94-
Datatype=class(A), ...
95-
DeflateLevel=1, Shuffle=true, ...
96-
ChunkSize=auto_chunk_size(sizeA), ...
97-
Format='netcdf4')
52+
try
53+
if ncexists(filename, varname)
54+
nc_exist_file(filename, varname, A, sizeA)
55+
else
56+
nc_new_file(filename, varname, A, sizeA, ncdims)
57+
end
58+
catch e
59+
if e.identifier == "MATLAB:imagesci:netcdf:unableToOpenFileforRead"
60+
nc_new_file(filename, varname, A, sizeA, ncdims)
61+
else
62+
rethrow(e)
63+
end
9864
end
9965

100-
ncwrite(filename, varname, A)
101-
10266
end % function
10367

10468
% Copyright 2020 Michael Hirsch
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
function h5_exist_file(filename, varname, A, sizeA)
2+
3+
import stdlib.hdf5nc.h5size
4+
5+
diskshape = h5size(filename, varname);
6+
if length(diskshape) >= 2
7+
% start is always a row vector, regardless of shape of array
8+
start = ones(1,ndims(A));
9+
elseif ~isempty(diskshape)
10+
start = 1;
11+
end
12+
13+
if isempty(sizeA)
14+
sizeA = defaultSize(A);
15+
end
16+
17+
if isscalar(A)
18+
h5write(filename, varname, A)
19+
elseif all(diskshape == sizeA)
20+
h5write(filename, varname, A, start, count=sizeA)
21+
elseif all(diskshape == fliplr(sizeA))
22+
h5write(filename, varname, A.', start, count=fliplr(sizeA))
23+
else
24+
error('hdf5nc:h5save:value_error', ['shape of ',varname,': ', int2str(sizeA), ' does not match existing HDF5 shape ', int2str(diskshape)])
25+
end
26+
27+
end % function

+stdlib/+hdf5nc/private/h5_new_file.m

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
function h5_new_file(filename, varname, A, sizeA)
2+
3+
if isempty(sizeA)
4+
if isscalar(A)
5+
h5_write_scalar(filename, varname, A)
6+
return
7+
elseif isvector(A)
8+
h5create(filename, varname, length(A), Datatype=class(A))
9+
else
10+
create_compress(filename, varname, A, size(A))
11+
end
12+
else
13+
if isscalar(sizeA)
14+
if sizeA == 0
15+
h5_write_scalar(filename, varname, A)
16+
return
17+
else
18+
h5create(filename, varname, sizeA, Datatype=class(A))
19+
end
20+
else
21+
create_compress(filename, varname, A, sizeA)
22+
end
23+
end
24+
25+
h5write(filename, varname, A)
26+
27+
end % function
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
function nc_exist_file(filename, varname, A, sizeA)
2+
3+
import stdlib.hdf5nc.ncsize
4+
5+
diskshape = ncsize(filename, varname);
6+
7+
if all(diskshape == sizeA)
8+
ncwrite(filename, varname, A)
9+
elseif all(diskshape == fliplr(sizeA))
10+
ncwrite(filename, varname, A.')
11+
else
12+
error('hdf5nc:ncsave:value_error', ['shape of ',varname,': ', int2str(sizeA), ' does not match existing NetCDF4 shape ', int2str(diskshape)])
13+
end
14+
15+
end % function

+stdlib/+hdf5nc/private/nc_new_file.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
function nc_new_file(filename, varname, A, sizeA, ncdims)
2+
import stdlib.hdf5nc.auto_chunk_size
3+
4+
if isscalar(A)
5+
nccreate(filename, varname, Datatype=class(A), Format='netcdf4')
6+
elseif isvector(A)
7+
nccreate(filename, varname, Dimensions=ncdims, Datatype=class(A), Format='netcdf4')
8+
else
9+
% enable Gzip compression--remember Matlab's dim order is flipped from
10+
% C / Python
11+
nccreate(filename, varname, Dimensions=ncdims, ...
12+
Datatype=class(A), ...
13+
DeflateLevel=1, Shuffle=true, ...
14+
ChunkSize=auto_chunk_size(sizeA), ...
15+
Format='netcdf4')
16+
end
17+
18+
ncwrite(filename, varname, A)
19+
20+
end % function

0 commit comments

Comments
 (0)