Я собрал это вместе с разных сайтов .... Проблема в том, что Windows все еще кеширует все, даже с возможностью записи. Таким образом, ваша «свободная» память уменьшается, если вы используете стандартный FileStream, что может быть проблематично, если вы пытаетесь делать определенные вещи с очень большими файлами и одновременно захватывать данные с высокой скоростью. Windows все еще имеет файлы, кэшированные при закрытии приложения, кстати. Это хорошо для файлов, которые вы хотите написать и забыть о ... которые, кажется, .Net не думают, что вам нужно.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace ConsoleApplication2
{
class Program
{
[DllImport("KERNEL32", SetLastError = true)]
public extern static int CloseHandle(IntPtr hObject);
[DllImport("kernel32", SetLastError = true)]
public static extern unsafe IntPtr CreateFile(
string FileName, // file name
uint DesiredAccess, // access mode
uint ShareMode, // share mode
IntPtr SecurityAttributes, // Security Attr
uint CreationDisposition, // how to create
uint FlagsAndAttributes, // file attributes
IntPtr hTemplate // template file
);
static void Main(string[] args)
{
const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;
Random r = new Random(0);
IntPtr f = CreateFile(@"e:\test\temp.bin",
(uint)FileAccess.Write,
(uint)FileShare.None,
IntPtr.Zero,
(uint)FileMode.Create,
FILE_FLAG_NO_BUFFERING,
IntPtr.Zero);
using (FileStream fs = new FileStream(f,FileAccess.Write,false,1024*1024))
{
int blocksize = 1024 * 1024;
byte[] val = new byte[blocksize];
for (int i = 0; i < blocksize; i++)
{
val[i] = 1;
}
while (true)
{
for (int i = 0; i < 1000; i++)
{
for (int j = 0; j < blocksize; j++)
{
fs.WriteByte(val[i]);
}
}
Console.WriteLine("Enter s to stop");
ConsoleKeyInfo k = Console.ReadKey();
if (k.KeyChar == 's')
{
break;
}
}
}
CloseHandle(f);
Console.WriteLine("done");
Console.ReadKey();
}
}
}