- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要以原始模式打开读取磁盘,因此我为此目的使用了 CreateFile API 函数。
private static FileStream OpenDisk(string drive)
{
// Try to open hard disk drive in raw mode for reading
SafeFileHandle safeHandle = Native.CreateFile(
string.Format(@"\\.\{0}", drive),
FileAccess.Read,
FileShare.Read,
IntPtr.Zero,
FileMode.Open,
FileAttributes.ReadOnly | FileAttributes.Device,
IntPtr.Zero);
// Check if the drive was successfully opened
if (safeHandle.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
// Create file stream on the file for reading
return new FileStream(safeHandle, FileAccess.Read);
}
但是当我尝试从流中读取时出现以下错误
句柄不支持同步操作。可能需要更改 FileStream 构造函数的参数以指示句柄是异步打开的(即,它是为重叠 I/O 显式打开的)。
这是重现此问题的示例代码
using (FileStream stream = OpenDisk("X:"))
{
byte[] buffer = new byte[1000];
while (stream.Read(buffer, 0, 1000) > 0) { }
}
我真的不明白它想从我这里得到什么?当我使用更大的缓冲区(例如 4096)时,它会起作用。当我说它有效时,我的意思是它真的(总是)有效,它工作了一段时间,直到我更改缓冲区大小。我猜它在内部执行某种异步缓冲,当我指定比默认缓冲大小时更大的缓冲区时,它只是没有被使用,但如何摆脱它?
谢谢
更新
当我尝试使用 BufferedStream 读取它时,我遇到了同样的问题
using (BufferedStream stream = new BufferedStream(OpenDisk("X:"), 4096))
{
byte[] buffer = new byte[1000];
while (stream.Read(buffer, 0, 1000) > 0) { }
}
我是否理解 BufferedStream 的错误用途?它不应该读取和缓存指定大小的 block 吗?
最佳答案
简而言之,从卷中读取是非缓冲的,并且必须是整个扇区。缓冲区大小为 4096 可实现此目的。该错误消息具有误导性,因为异步 I/O 和非缓冲往往会结合在一起。一些细节:
来自CreateFile docs :
即使在 CreateFile 中未指定非缓存选项,卷句柄也可以根据特定文件系统的判断以非缓存方式打开。您应该假定所有 Microsoft 文件系统都将卷句柄打开为非缓存的。对文件的非缓存 I/O 的限制也适用于卷。
关于c# - 句柄不支持与 CreateFile 的同步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608190/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!