在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不是解决问题的方法。所以请不要理会。 p>
另外,抱歉没有更清楚。基本上我想将文件移动到磁盘上分区的开头。我认为IntPtr也可以指向磁盘地址,但回想起来我可以看到它当然不能。 无论如何,对此感到抱歉。
答案 0 :(得分:1)
文件在内存中没有地址。所以你所要求的是一种不合理的东西。
据我所知,您根本不需要任何不安全的代码。您无需致电CopyMemory
。而且您不需要一次加载整个文件然后复制。你能做的是:
Marshal.Copy
将其复制到非托管内存位置。代码可能如下所示:
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;
}
}