有没有办法将文件从路径A复制到路径B并抑制Windows文件系统缓存?
典型用途是从USB驱动器或服务器复制大文件到本地计算机。如果文件非常大,例如2GiB,则Windows似乎会将所有内容都交换出去。
最好使用C#示例,但如果可能的话,我猜这将是一种Win32调用。
有没有办法将文件从路径A复制到路径B并抑制Windows文件系统缓存?
典型用途是从USB驱动器或服务器复制大文件到本地计算机。如果文件非常大,例如2GiB,则Windows似乎会将所有内容都交换出去。
最好使用C#示例,但如果可能的话,我猜这将是一种Win32调用。
在C#中,我发现可以像这样工作,这可以更改为直接复制到目标文件:
public static byte[] ReadAllBytesUnbuffered(string filePath)
{
const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
var fileInfo = new FileInfo(filePath);
long fileLength = fileInfo.Length;
int bufferSize = (int)Math.Min(fileLength, int.MaxValue / 2);
bufferSize += ((bufferSize + 1023) & ~1023) - bufferSize;
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None,
bufferSize, FileFlagNoBuffering | FileOptions.SequentialScan))
{
long length = stream.Length;
if (length > 0x7fffffffL)
{
throw new IOException("File too long over 2GB");
}
int offset = 0;
int count = (int)length;
var buffer = new byte[count];
while (count > 0)
{
int bytesRead = stream.Read(buffer, offset, count);
if (bytesRead == 0)
{
throw new EndOfStreamException("Read beyond end of file EOF");
}
offset += bytesRead;
count -= bytesRead;
}
return buffer;
}
}
我不确定这是否有所帮助,但请查看使用FILE_FLAG_SEQUENTIAL_SCAN提高性能。
摘要
CreateFile()有一个名为FILE_FLAG_SEQUENTIAL_SCAN的标志,它将指示缓存管理器按顺序访问文件。
任何使用顺序访问读取潜在大文件的人都可以指定此标志以提高性能。如果您正在读取“大多数”顺序文件,但偶尔跳过小字节范围,则此标志非常有用。
我知道这个问题是11年前的,现在有一个名为robocopy的工具,可以替代xcopy。
你需要检查/J选项
/J :: 使用无缓存I/O进行复制(建议用于大文件)
Eseutil是一个正确的答案,自Win7 / 2008 R2以来,您可以在Xcopy中使用/j开关,其具有相同的效果。