【问题标题】:Filestream.SetLength() "The parameter is incorrect"Filestream.SetLength() "参数不正确"
【发布时间】:2015-05-27 20:45:42
【问题描述】:

所以我尝试以增量方式填充媒体设备并测量速度,直到我将数据从 75% 写入到 95%(我们没有完全填充)

当我去设置文件长度时(例如:当磁盘有 3.72 GB 可用时,我试图制作一个 3.1GB 的文件,我得到以下异常

“参数不正确。”

堆栈跟踪

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.SeekCore(Int64 offset, SeekOrigin origin)
at System.IO.FileStream.SetLengthCore(Int64 value)
at System.IO.FileStream.SetLength(Int64 value)
at DiskSpeed.Write.WriteFileFromMemory(Byte[] buffer, String path, Int64 fileSize, Int32 currentIteration, Int32 totalIterations, CancellationToken ct)

这是代码

using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 8, FileOptions.WriteThrough | FileFlagNoBuffering))
{
    fs.SetLength(fileSize);
    .......
}

我正在使用它以 25% 的增量将块写入可移动媒体,但在 75% 之后,我只写入 20% 的块。从 0-75% 可以正常工作,这是引发此错误的最后一个块。是的,我已经仔细检查了文件大小,还有空间!!!

有人有什么想法吗?我不知所措,似乎在网上找不到任何东西。

【问题讨论】:

  • 根据documentation 一个流必须同时支持写入和寻找 SetLength 才能工作。,但我在你的例子中看不到任何关于寻找的东西......不是确定这是否有帮助。
  • 异常的确切类型是什么?
  • 当您呼叫SetLength 时,fileSize 是什么?
  • 看一下:stackoverflow.com/a/1374156/461810 可能有问题,可能是这个标志引起的问题
  • 当您使用 FileFlagNoBuffering 选项(不管拼写错误)时,您的工作就是确保您寻找的位置是卷扇区大小的整数倍。 “95%”并不是一个很好的衡量标准。

标签: c# disk-io


【解决方案1】:
private const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;

这是导致问题的原因。谢谢杜桑!

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2019-05-23
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2020-03-13
    相关资源
    最近更新 更多