共享内存,写入文件

本文关键字:文件 内存 共享 | 更新日期: 2023-09-27 18:06:34

我在碎片内存中有TXT文件。代码在最后。我一直在尝试将它从内存中取出并写入C:' drive.

中的文件。

但是我得到一个错误:

    Type 'SharedMemSaveToFile.SharedMemSaver+Data' cannot be marshaled as an 
unmanaged structure; no meaningful size or offset can be computed.

如果我改变代码来写内存的CMD,它的工作原理,所以我知道内存在那里。我也试着用这些来写TXT:

 System.IO.StreamWriter file = new System.IO.StreamWriter("c:''file.txt");
 file.WriteLine(d);

:

using (StreamWriter outfile = new StreamWriter(d + @"C:''file.txt"))
{
     outfile.Write(sb.ToString());
}

:

StreamWriter sw = new StreamWriter("file.txt");
    sw.Write(d);
    sw.Close();

谢谢!

    public class Data
    {
        static void Main(string[] args)
        {
            SharedMemSaver sf = new SharedMemSaver();
            sf.OpenView();
            String d = sf.GetData();
            System.IO.File.WriteAllText(@"C:'file.txt", d);
        }
    }
    #region Win32 API stuff
    public const int FILE_MAP_READ = 0x0004;
    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern IntPtr OpenFileMapping(int dwDesiredAccess,
        bool bInheritHandle, StringBuilder lpName);
    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern IntPtr MapViewOfFile(IntPtr hFileMapping,
        int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow,
        int dwNumberOfBytesToMap);
    [DllImport("Kernel32.dll")]
    internal static extern bool UnmapViewOfFile(IntPtr map);
    [DllImport("kernel32.dll")]
    internal static extern bool CloseHandle(IntPtr hObject);
    #endregion
    private bool fileOpen = false;
    private IntPtr map;
    private IntPtr handle;
    ~SharedMemSaver()
    {
        CloseView();
    }
    public bool OpenView()
    {
        if (!fileOpen)
        {
            StringBuilder sharedMemFile = new StringBuilder("Mem_Values");
            handle = OpenFileMapping(FILE_MAP_READ, false, sharedMemFile);
            if (handle == IntPtr.Zero)
            {
                throw new Exception("Unable to open file mapping.");
            }
            map = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, Marshal.SizeOf((Type)typeof(Data)));
            if (map == IntPtr.Zero)
            {
                throw new Exception("Unable to read shared memory.");
            }
            fileOpen = true;
        }
        return fileOpen;
    }
    public void CloseView()
    {
        if (fileOpen)
        {
            UnmapViewOfFile(map);
            CloseHandle(handle);
        }
    }
    public String GetData()
    {
        if (fileOpen)
        {
            String data = (String)Marshal.PtrToStringAuto(map);
            return data;
        }
        else
        {
            return null;
        }
    }
}

}

共享内存,写入文件

我强烈建议使用内置的MemoryMappedFile类(在。net 4中新增)

请看Yahia的答案。

但是试图修复你的代码时,错误信息显示all:
你想从Marshal.SizeOf((Type)typeof(Data))那里得到什么?
它没有大小,因为它没有数据。查看MSDN文档。MapViewOfFile的最后一个参数"如果该参数为0(零),则映射从指定的偏移量扩展到文件映射的末尾。"