Wil*_*ean 5 .net c# filesystems
.NET框架中是否有任何类提供对\.\ G: - 样式路径的访问.(即原始卷)?
我们目前使用p /调用的ReadFile和WriteFile没有任何问题,这对于同步访问并不复杂,但添加异步读/写是很繁琐的,因为你需要特别注意接管和处理OVERLAPPED结构和管理事件对象的生命周期等(即我们在Win32代码中必须做的所有繁琐工作......)
使用任何简单的测试技术,很难证明您与GC的交互也是正确的.
毫无疑问,FileStream类包含所有这些代码,完全是防弹和精致的方式,并利用了许多我们无法使用的内部帮助程序.不幸的是,FileStream明确地阻止你打开原始卷,所以我们不能使用它.
框架中还有什么可以帮助避免从头开始编写这种代码吗?我在Reference Source中讨论过,但没有任何消息.
更新 - 我们已经尝试了下面的建议,以避免通过自己打开设备并传入句柄来检查路径类型.当我们尝试这个时,会出现以下错误(请注意,此跟踪会通过FileStream的contstructor - 即我们根本没有任何机会与流进行交互):
System.IO.IOException: The parameter is incorrect.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.SeekCore(Int64 offset, SeekOrigin origin)
at System.IO.FileStream..ctor(SafeFileHandle handle, FileAccess access, Int32 bufferSize, Boolean isAsync)
at OurApp.USBComms.UsbDevice..ctor(Char driveLetter) in
Run Code Online (Sandbox Code Playgroud)
作为参考,我们的CreateFile调用如下所示:
var deviceName = String.Format(@"\\.\{0}:", driveLetter);
var handle = SafeNativeMethods.CreateFile(deviceName,
0x80000000 | 0x40000000,
FileShare.ReadWrite,
0,
FileMode.Open,
(uint)FileOptions.Asynchronous | 0x20000000, // Last option is 'FILE_FLAG_NO_BUFFERING'
IntPtr.Zero);
if (handle.IsInvalid)
{
throw new IOException("CreateFile Error: " + Marshal.GetLastWin32Error());
}
Run Code Online (Sandbox Code Playgroud)
Update3:事实证明(无论如何,在一个卷句柄上),你不能在用FILE_FLAG_OVERLAPPED打开的句柄上调用SetFilePointer.这是有道理的,因为SetFilePointer对于无论如何都有任何类型的多线程访问的文件都是无用的.不幸的是,FileStream似乎决定在构造过程中出于某种原因(仍然试图追踪原因)调用它,这是导致失败的原因.
我相信您可以使用FileStream 的此构造函数传递预先打开的 FileHandle 作为SafeFileHandle实例。这样您就拥有了FileStream可用于发出异步 I/O 操作的托管实例。
public FileStream(SafeFileHandle handle, FileAccess access, int bufferSize, bool isAsync);
Run Code Online (Sandbox Code Playgroud)
另外,当您计划执行异步 I/O 时,不要忘记将isAsnc标志设置为 true。否则您将无法获得异步 I/O 的所有好处。