如何获取文件的内存地址

时间:2014-11-18 09:45:03

标签: c# file memory-address

在WCE应用程序中,我正在寻找一种方法将文件(我只需要文件名/路径)复制到特定的内存地址。 文件相当大,大约40MB,所以资源有限,我希望通过使用这篇文章的答案避免将整个文件读入内存(字节数组): Copy data from from IntPtr to IntPtr

[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] 
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); 
static void Main() 
{ 
    const int size = 200; 
    IntPtr memorySource = Marshal.AllocHGlobal(size); 
    IntPtr memoryTarget = Marshal.AllocHGlobal(size);
    CopyMemory(memoryTarget,memorySource,size); 
}

这让我有两个问题。 首先:如何为IntPtr分配内存地址?,有点像:int* startAddr = &0x00180000

其次:如何获取文件的内存地址?

回答完这两个问题后,我的代码看起来像是:

[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
private unsafe void CopyFile()
{
    try
    {
        fixed (Int32* startAddr = /*0x00180000*/)
        {
            fixed(Int32* fileAddr = /*Memory Address of file*/)
            {
                CopyMemory(new IntPtr(startAddr), new IntPtr(fileAddr), (uint)new FileInfo("File name").Length);
            }
        }
    }
    catch { }
}

这是一种有效的方法吗?

非常感谢任何帮助。在此先感谢!!

更新 CopyMemory不是解决问题的方法。所以请不要理会。

另外,抱歉没有更清楚。基本上我想将文件移动到磁盘上分区的开头。我认为IntPtr也可以指向磁盘地址,但回想起来我可以看到它当然不能。 无论如何,对此感到抱歉。

1 个答案:

答案 0 :(得分:1)

文件在内存中没有地址。所以你所要求的是一种不合理的东西。

据我所知,您根本不需要任何不安全的代码。您无需致电CopyMemory。而且您不需要一次加载整个文件然后复制。你能做的是:

  1. 使用标准文件流来读取文件。
  2. 将小块文件读入一个小缓冲区。具体来说,您可以选择以8KB块的形式读取文件。
  3. 每次阅读文件块时,通过调用Marshal.Copy将其复制到非托管内存位置。
  4. 代码可能如下所示:

    static void CopyStreamToMemory(Stream stream, IntPtr addr, int bufferSize)
    {
        byte[] buffer = new byte[bufferSize];
        long bytesLeft = stream.Length - stream.Position;
        while (bytesLeft > 0)
        {
            int bytesToCopy = (int)Math.Min(bufferSize, bytesLeft);
            stream.Read(buffer, 0, bytesToCopy);
            Marshal.Copy(buffer, 0, addr, bytesToCopy);
            addr += bytesToCopy;
            bytesLeft -= bytesToCopy;
        }
    }