public static unsafe void AddExternalDataset(long fileId, string datasetName, string absolutePrefix, H5DatasetAccess datasetAccess) { long res; var bytesoftype = 4; var dcpl_id = H5P.create(H5P.DATASET_CREATE); var dapl_id = H5P.create(H5P.DATASET_ACCESS); res = H5P.set_layout(dcpl_id, H5D.layout_t.CONTIGUOUS); // a (more than one chunk in file) var pathA = H5Utils.ConstructExternalFilePath(Path.Combine(absolutePrefix, $"{datasetName}_a.raw"), datasetAccess); if (File.Exists(pathA)) { File.Delete(pathA); } res = H5P.set_external(dcpl_id, pathA, new IntPtr(120), (ulong)(10 * bytesoftype)); res = H5P.set_external(dcpl_id, pathA, new IntPtr(80), (ulong)(10 * bytesoftype)); res = H5P.set_external(dcpl_id, pathA, new IntPtr(0), (ulong)(10 * bytesoftype)); // b (file size smaller than set size) var pathB = H5Utils.ConstructExternalFilePath(Path.Combine(absolutePrefix, $"{datasetName}_b.raw"), datasetAccess); if (File.Exists(pathB)) { File.Delete(pathB); } res = H5P.set_external(dcpl_id, pathB, new IntPtr(0), (ulong)(10 * bytesoftype)); // c (normal file) var pathC = H5Utils.ConstructExternalFilePath(Path.Combine(absolutePrefix, $"{datasetName}_c.raw"), datasetAccess); if (File.Exists(pathC)) { File.Delete(pathC); } res = H5P.set_external(dcpl_id, pathC, new IntPtr(0), (ulong)((TestData.MediumData.Length - 40) * bytesoftype)); // write data if (datasetAccess.ExternalFilePrefix is not null) { H5P.set_efile_prefix(dapl_id, datasetAccess.ExternalFilePrefix); } TestUtils.Add(ContainerType.Dataset, fileId, "external", datasetName, H5T.NATIVE_INT32, TestData.MediumData.AsSpan(), apl: dapl_id, cpl: dcpl_id); // truncate file b using (var fileStream2 = File.OpenWrite(pathB)) { fileStream2.SetLength(10); }; res = H5P.close(dapl_id); res = H5P.close(dcpl_id); }