123 lines
4.0 KiB
C#
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}
|
||
|
}
|