我正在使用Windows 7上的本机C++/Win32/MFC应用程序.我正在使用CFile打开存储在远程服务器上的文件(带有标志,CFile :: modeRead | CFile :: shareDenyWrite).服务器正在运行Windows Server 2008,我通过常规Windows文件共享访问共享驱动器上的文件.一旦我打开文件,我就按照下面的描述阅读它.
首先,我正在寻找文件中的多个位置(10个位置)和读取小(128个字节)的部分.然后,我正在寻找开头并顺序阅读整个文件.
我注意到的是,执行上述操作比打开文件并通读它要慢得多.初始随机搜索和采样非常快,即使使用大文件也几乎是即时的.有趣的是,即使这很快,下一部分,扫描文件的速度非常慢,而只是在没有初始随机访问的情况下进行扫描.
在试图弄清楚发生了什么时,我拉起了性能监视器并观察了网络流量.如果我只是通过文件执行顺序读取,我通过无线适配器下载3.5MB/s.如果我首先随机搜索,那么顺序读取我在顺序读取期间只获得300kB/s.
解决方案是在执行随机访问部分后关闭并重新打开文件.当我这样做时,顺序读取加速.
所以似乎做随机访问读取(搜索和读取)在服务器上做了一些事情,然后导致顺序读取缓慢.我想知道,有没有人知道这里发生的事情是什么,我看到的行为的实际原因是什么?虽然我已经解决了这个问题,但我想更好地了解引擎盖下发生的事情.
我在Windows上使用本机/ C++/Win32/MFC代码通过MFC序列化保存文档文件.我在写入过程中插入了自己的CFile派生类,使我能够在写入数据时访问数据.这允许我在数据输出到文件时计算校验和(或散列等).
文件保存后,我想允许验证文件的选项.我们的想法是重新打开文件并通过它来验证校验和/散列/等.
我想知道,如果可能的话,在刚刚写完文件之后,当我立即读回文件时,操作系统可能会给我不成文的数据.在这种情况下,测试并没有真正告诉我该文件在磁盘上看起来不错.
我的担忧有效吗?如果是这样,有什么办法可以避免这个问题吗?
我在PowerShell中定义了一个函数,并尝试调用它,如下所示.
function foo([Int32] $a, [Int32] $b)
{
}
foo(0,0)
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误.
foo : Cannot process argument transformation on parameter 'a'. Cannot convert the "System.Object[]" value of type "System.Object[]" to type
"System.Int32".
At line:1 char:4
+ foo <<<< (0,0)
+ CategoryInfo : InvalidData: (:) [foo], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,foo
Run Code Online (Sandbox Code Playgroud)
如果我将函数更改为仅接受单个参数,如下所示,它可以正常工作.
function foo([Int32] $a)
{
}
foo(0)
Run Code Online (Sandbox Code Playgroud)
或者,如果我删除类型信息,它也可以如下所示工作.
function foo($a, $b)
{
}
foo(0,0)
Run Code Online (Sandbox Code Playgroud)
第一个版本出了什么问题?如何正确定义一个带有多个整数参数的函数?
编辑:有趣的是,以下调用确实有效.
foo 0 0
Run Code Online (Sandbox Code Playgroud)
我更喜欢()s,但我想知道如何让它与它们一起工作.
我在Windows 7上的Visual Studio 2013 Pro中使用C#5/.NET 4.5.
我想处理项目集合,其中唯一的要求是项目实现特定的接口.集合中的项目不一定是公共继承树的一部分(即集合不会基于共同的祖先),它们可以是任意类,但都将实现指定的接口(因此目标是基于集合)在他们都实现的通用接口上).
我遇到了麻烦.如果我有一组实现所需接口的项目,我无法将该集合传递给需要基于接口的集合的方法.
这里有一些代码可以使它更具体.
using System.Collections.Generic;
class Test
{
public interface IDrawable
{
void Draw();
}
public class Shape : IDrawable
{
public void Draw() {}
}
public void DrawItems(List<IDrawable> itemsToDraw) {}
public Test()
{
List<Shape> shapes = new List<Shape>();
DrawItems(shapes);
}
}
Run Code Online (Sandbox Code Playgroud)
对DrawItems的调用会生成编译器错误.该方法期望实现IDrawable的项集合.我正在传递一组Shape对象.由于Shape对象确实实现了IDrawable,我希望我可以逃脱这个.
看起来这不起作用,但我想了解原因.我查阅了关于协方差和逆变的信息,但没有找到任何专门针对这种情况的信息.
关于为什么这不起作用的任何想法或信息?