- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
一些背景知识:我一直在尝试在对大文件进行 IO 时使用 FILE_FLAG_NO_BUFFERING 标志。我们正在尝试减少缓存管理器的负载,希望通过后台 IO 减少我们的应用程序对用户机器的影响。性能不是问题。尽可能多地躲在幕后是一个大问题。我有一个用于执行无缓冲 IO 的接近工作的包装器,但我遇到了一个奇怪的问题。当我使用不是 4 的倍数的偏移量调用 Read 时出现此错误。
Handle does not support synchronous operations. The parameters to the FileStream constructor may need to be changed to indicate that the handle was opened asynchronously (that is, it was opened explicitly for overlapped I/O).
为什么会这样?这条信息不是自相矛盾吗?如果我添加异步文件选项,我会得到一个 IOException(参数不正确。)
我想真正的问题是这些要求是什么,http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx , 与这些 4 的倍数有关。
这是演示问题的代码:
FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
int MinSectorSize = 512;
byte[] buffer = new byte[MinSectorSize * 2];
int i = 0;
while (i < MinSectorSize)
{
try
{
using (FileStream fs = new FileStream(@"<some file>", FileMode.Open, FileAccess.Read, FileShare.None, 8, FileFlagNoBuffering | FileOptions.Asynchronous))
{
fs.Read(buffer, i, MinSectorSize);
Console.WriteLine(i);
}
}
catch { }
i++;
}
Console.ReadLine();
最佳答案
使用 FILE_FLAG_NO_BUFFERING
时,记录的要求是读取或写入的内存地址必须是物理扇区大小的倍数。在您的代码中,您允许随机选择字节数组的地址(因此不太可能是物理扇区大小的倍数),然后添加一个偏移量。
您观察到的行为是,如果偏移量是 4 的倍数,则调用有效。字节数组很可能与 4 字节边界对齐,因此如果内存地址是 a,则调用有效4 的倍数。
因此,您的问题可以这样重写:为什么当内存地址是 4 的倍数时读取工作正常,而文档说它必须是 512 的倍数?
答案是文档没有对违反规则会发生什么做出任何具体保证。调用仍然有效可能会发生。电话可能无论如何都有效,但仅在偶数年的 9 月有效。无论如何调用都可能会发生,但前提是内存地址是 4 的倍数。(这很可能取决于读取操作中涉及的特定硬件和设备驱动程序。仅仅因为它在你的机器上工作并不'并不意味着它对其他任何人都有效。)
首先将 FILE_FLAG_NO_BUFFERING
与 FileStream
一起使用可能不是一个好主意,因为我怀疑 FileStream
是否真的能保证它会把你给它的地址原封不动地传递给底层的 ReadFile
调用。相反,使用 P/Invoke 直接调用底层 API 函数。您可能还需要以这种方式分配内存,因为我不知道 .NET 是否提供任何方式来分配具有特定对齐方式的内存。
关于c# - 使用 FileStream 和 FILE_FLAG_NO_BUFFERING 读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377914/
我需要对同一文件进行一批写入,但在文件内的不同位置。我想以尽可能最好的性能实现这一目标,因此查看了同步 FileStream.Write 和异步 FileStream.BeginWrite 方法。 同
MSDN说FileStream.Flush(True) “还清除所有中间文件缓冲区。”。 “所有中间文件缓冲区”到底是什么意思? 最佳答案 它会将缓冲在文件系统缓存中的文件数据写入磁盘。该数据通常是根
考虑以下摘自 Microsoft docs 的代码: using FileStream createStream = File.Create(fileName); // ...write to str
我对Spark的理解fileStream()方法是将三种类型作为参数:Key , Value , 和 Format .对于文本文件,适当的类型是:LongWritable , Text , 和 Tex
为什么 FileStream.Length 是 long 类型,但 FileStream.Read 参数 - offset 有更短的长度 int 呢? 布莱恩 最佳答案 offset 参数告诉从哪里开
我编写了以下程序,其目的是创建一个给定大小的文件,其中包含一些随机数据。该程序运行良好,并完成了它应该做的事情。但是,我不明白为什么它会消耗 5GB 的 RAM(请参阅我的任务管理器的屏幕截图)。当我
我在一次采访中被问到这个问题,我说答案是 Managed。面试官似乎很惊讶。我的问题是即使它访问一个文件( native /非托管资源),但这个类不是托管的吗?或者你认为我应该有一些后续问题以获得更多
我正在编写一些代码作为打开文件框架的一部分。该文件属于自定义类型,不应由我的应用程序的多个实例打开。为了停止打开多个文件,我使用文件流创建一个锁定文件,然后保持所述文件流打开。 这似乎可以防止我的应用
我正在使用 Apache Commons Net 的 FTPClient 从位于服务器上的文件中读取内容。仅读取一次时效果很好。但是当我尝试读取第二个文件时,FTPClient 的 InputStre
问题 有没有办法在 C# 中创建带偏移量的 FileStream?例如,如果我在偏移量 100 处打开 SomeFile.bin,Stream.Position 将等于 0,但读取和写入将偏移 100
我正在阅读一个简单的文本文件,其中包含使用文件流类的单行。但似乎 filestream.read 在开头添加了一些垃圾字符。 代码下方。 using (var _fs = File.Open(_idF
我正在使用 FileStream 将 FTP 服务器的信息下载到我的 C:\驱动器上的目录中。出于某种原因,即使我什至尝试将目录权限设置为“所有人”访问权限,它也给了我这个异常(exception):
我正在尝试通过将文件作为参数的 API 上传 .srt 文件。 文件存储在服务器上,我正在使用 FileStream 和 StreamWriter 写入: string path = Server.M
我四处搜索了一下,但找不到能完美解决我的问题的东西。我有一些代码,即来 self 的数据库的 FileStream varbinary,并将其制作成客户端计算机上的文件,双击时可以在文件类型的默认应用
我最近在做一个涉及很多FileStreaming 的项目,这是我以前没有真正接触过的。 为了尝试更好地熟悉这些方法的原理,我编写了一些代码(理论上)将文件从一个 dir 下载到另一个,并逐步完成,在我
我通过例如下载文件5 个线程。当其中一个线程完成下载文件部分时 - 它被中止,但所有其余线程都有 ThreadState = WaitSleepJoin 并且显然停止下载。如何解决? while ((
我试图将 5 GB 的 ISO 文件复制到具有 29 GB 可用空间的 32 GB 闪存驱动器上。 Windows 7 拒绝让我拖放文件到闪存驱动器,报告文件对于目标文件系统来说太大了。 我最终了解到
我发现将 BufferedStream 与 FileStream 结合使用没有意义,因为它有自己的缓冲策略。然而,我想知道一件事: FileStream fsWithBuffer = new File
我有一个只读的 FileStream,它是一个方法局部变量: public void SomeMethod() { var fileStream = File.Open(fileName, Fi
我有两个文件流,它们从不同的文件中收集不同的信息: FileStream dataStruc = new FileStream("c:\\temp\\dataStruc.txt", FileMode.
我是一名优秀的程序员,十分优秀!