public int Read(FileInfo info, string name, ref Span <byte> data) { using Kernel32.SafeHFILE handle = Kernel32.CreateFile($"{info.FullName}:tsuku.{name}", Kernel32.FileAccess.FILE_GENERIC_READ, FileShare.Read, null, FileMode.Open, FileFlagsAndAttributes.FILE_ATTRIBUTE_NORMAL); if (handle == HFILE.INVALID_HANDLE_VALUE) { Kernel32.GetLastError().ThrowIfFailed(); } int maxRead = Math.Min(data.Length, Tsuku.MAX_ATTR_SIZE); // Kernel32.SafeHFILE should close after on dispose. using var stream = new FileStream(new SafeFileHandle(handle.DangerousGetHandle(), false), FileAccess.Read); return(stream.Read(data[..maxRead]));
public void Write(FileInfo info, string name, ReadOnlySpan <byte> data) { using Kernel32.SafeHFILE handle = Kernel32.CreateFile($"{info.FullName}:tsuku.{name}", Kernel32.FileAccess.FILE_GENERIC_WRITE, FileShare.Write, null, FileMode.OpenOrCreate, FileFlagsAndAttributes.FILE_ATTRIBUTE_NORMAL); if (handle == HFILE.INVALID_HANDLE_VALUE) { Kernel32.GetLastError().ThrowIfFailed(); } // Kernel32.SafeHFILE should close after on dispose. using var stream = new FileStream(new SafeFileHandle(handle.DangerousGetHandle(), false), FileAccess.ReadWrite); stream.Write(data); stream.Flush(); }