I would try to address the task on a lower level. "Opening" a file in common terms means only that I acquire a handle from a file system driver in the operating system, and in all my file operations I am using this driver and the handle I got.
But of course you can write your own tools to access the file system bypassing the driver. You can write your own driver, but also rely on some low level api functions to read the file system directly. Of course, to do this you need certain privileges, and I am not sure if you will be able to do this in managed code.
I would start from here, even if this is unmanaged:
An NTFS Parser Lib[
^]
Good luck!