gpt4 book ai didi

c# - 使用 .NET 进行低级文件访问

转载 作者:太空狗 更新时间:2023-10-29 23:14:12 27 4
gpt4 key购买 nike

.NET 框架中是否有任何类提供对\.\G: - 样式路径的访问。 (即原始卷)?

我们目前正在使用 p/invoked ReadFile 和 WriteFile 毫无问题地执行此操作,这对于同步访问来说并不复杂,但是添加异步读/写很乏味,因为您需要非常小心地接管 pinning 和处理 OVERLAPPED 结构和管理事件对象生命周期等(即我们必须在 Win32 代码中做的所有繁琐的事情......)

很难用任何简单的测试技术来证明您与 GC 的交互也是正确的。

FileStream 类包含所有这些代码,毫无疑问,这是一种完全防弹和精致的方式,并利用了许多我们无法使用的内部助手。不幸的是,FileStream 明确阻止您打开原始卷,因此我们无法使用它。

框架中是否还有其他任何东西可以帮助避免从头开始编写此类代码?我在 Reference Source 中查看过,但没有任何内容。

更新 - 我们已经尝试了下面的建议,通过自己打开设备并传入句柄来避免检查路径类型。当我们尝试这样做时,它会爆炸并出现以下错误(请注意,此跟踪通过 FileStream 的构造函数 - 即我们根本没有机会与流进行交互): p>

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

作为引用,我们的 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());
}

更新 3:事实证明(无论如何,在卷句柄上),您不能在已使用 FILE_FLAG_OVERLAPPED 打开的句柄上调用 SetFilePointer。这是有道理的,因为 SetFilePointer 对于存在任何类型的多线程访问的文件毫无用处。不幸的是,FileStream 似乎出于某种原因(仍在尝试追查原因)决定在构建期间调用它,这就是导致失败的原因。

最佳答案

正如 Sriram Sakthivel 指出的 (+1),您可以将 SafeFileHandle 传递给 FileStream 构造函数。

根据您的堆栈跟踪,我假设您试图将流搜索到无效位置;原始磁盘/卷有关于读/写位置的特殊规则。

例如,您不能从一个扇区的中间开始读取磁盘(您必须读取/查找每个 512 字节的 block )。尝试读取偏移量 0 处的实例,看看它是否工作得更好。

关于c# - 使用 .NET 进行低级文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28900525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com