C#通過指針讀取文件


// readfile.cs
// 編譯時使用:/unsafe
// 參數:readfile.txt

// C#通過指針讀取文件。使用該程序讀並顯示文本文件。
using System;
using System.Runtime.InteropServices;
using System.Text;

class FileReader
{
    const uint GENERIC_READ = 0x80000000;
    const uint OPEN_EXISTING = 3;
    IntPtr handle;

    [DllImport("kernel32", SetLastError=true)]
    static extern unsafe IntPtr CreateFile(
        string FileName,                // 文件名
        uint DesiredAccess,             // 訪問模式
        uint ShareMode,                 // 共享模式
        uint SecurityAttributes,        // 安全屬性
        uint CreationDisposition,       // 如何創建
        uint FlagsAndAttributes,        // 文件屬性
        int hTemplateFile               // 模板文件的句柄
        );

    [DllImport("kernel32", SetLastError=true)]
    static extern unsafe bool ReadFile(
        IntPtr hFile,                   // 文件句柄
        void* pBuffer,              // 數據緩沖區
        int NumberOfBytesToRead,    // 要讀取的字節數
        int* pNumberOfBytesRead,        // 已讀取的字節數
        int Overlapped              // 重疊緩沖區
        );

    [DllImport("kernel32", SetLastError=true)]
    static extern unsafe bool CloseHandle(
        IntPtr hObject   // 對象句柄
        );

    public bool Open(string FileName)
    {
        // 打開現有文件進行讀取
        handle = CreateFile(
            FileName,
            GENERIC_READ,
            0, 
            0, 
            OPEN_EXISTING,
            0,
            0);

        if (handle != IntPtr.Zero)
            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()
    {
        // 關閉文件句柄
        return CloseHandle(handle);
    }
}
////////////////////////////////////////////////////////////////////下面是測試代碼///////////////////////////////////////////////////////////////////////////////
class Test
{
    public static int Main(string[] args)
    {
        if (args.Length != 1)
        {
            Console.WriteLine("Usage : ReadFile <FileName>");
            return 1;
        }

        if (!System.IO.File.Exists(args[0]))
        {
            Console.WriteLine("File " + args[0] + " not found.");
            return 1;
        }

        byte[] buffer = new byte[128];
        FileReader fr = new FileReader();

        if (fr.Open(args[0]))
        {

            // 假定正在讀取 ASCII 文件
            ASCIIEncoding Encoding = new ASCIIEncoding();

            int bytesRead;
            do
            {
                bytesRead = fr.Read(buffer, 0, buffer.Length);
                string content = Encoding.GetString(buffer, 0, bytesRead);
                Console.Write("{0}", content);
            }
            while (bytesRead > 0);

            fr.Close();
            return 0;
        }
        else
        {
            Console.WriteLine("Failed to open requested file");
            return 1;
        }
    }
}

 參考鏈接:

C#通過指針讀取文件

C# 指針之美

C#下的指針運用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM