singrdk/base/Windows/Benchmarks/fileops/fileops.cs

123 lines
4.0 KiB
C#

// ----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ----------------------------------------------------------------------------
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text;
using webfiles;
namespace webfiles
{
class FileReader
{
//const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
const uint FILE_FLAG_NO_BUFFERING = 0;
const uint GENERIC_READ = 0x80000000;
const uint OPEN_EXISTING = 3;
IntPtr handle;
[DllImport("kernel32", SetLastError=true)]
private static extern unsafe IntPtr CreateFile(
string FileName, // file name
uint DesiredAccess, // access mode
uint ShareMode, // share mode
uint SecurityAttributes, // Security Attributes
uint CreationDisposition, // how to create
uint FlagsAndAttributes, // file attributes
int hTemplateFile // handle to template file
);
[DllImport("kernel32", SetLastError=true)]
private static extern unsafe bool ReadFile(
IntPtr hFile, // handle to file
void* pBuffer, // data buffer
int NumberOfBytesToRead, // number of bytes to read
int* pNumberOfBytesRead, // number of bytes read
int Overlapped // overlapped buffer
);
[DllImport("kernel32", SetLastError=true)]
private static extern unsafe bool CloseHandle(
IntPtr hObject // handle to object
);
[DllImport("kernel32", SetLastError=true)]
private static extern unsafe uint GetFileSize(
IntPtr hObject, // handle to object
uint *pFileSizeHigh // receives high 32-bits of file size.
);
public bool Open(string FileName)
{
// open the existing file for reading
handle = CreateFile(
FileName,
GENERIC_READ,
0,
0,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
0);
if (handle != IntPtr.Zero && handle != ((IntPtr) (-1))) {
return true;
}
else {
return false;
}
}
public unsafe int Read(byte[] buffer, int index, int count)
{
int n = 0;
fixed (byte* p = buffer) {
if (!ReadFile(handle, p + index, count, &n, 0)) {
return 0;
}
}
return n;
}
public bool Close()
{
// close file handle
return CloseHandle(handle);
}
public unsafe int Size()
{
return (int)GetFileSize(handle, null);
}
}
public class SpecMain
{
//--------------------------------------------------
// Main routine
//--------------------------------------------------
public static int Main(string[] args)
{
FileReader reader = new FileReader();
DateTime start = DateTime.Now;
for (int i = 1; i < 1000; i++) {
if (!reader.Open(args[0])) {
Console.WriteLine("Failed");
throw new Exception("argh..");
}
reader.Close();
}
DateTime end = DateTime.Now;
TimeSpan elapsed = end - start;
Console.WriteLine("5000 iterations = {0}",elapsed);
return 0;
} // main
} //specmain class}
}