How to read and write a file using Memory Mapped File C#?

前端 未结 2 1402
遥遥无期
遥遥无期 2021-01-01 07:03

I have an image in D Drive like \"D:\\Image\\1.tiff\". I want to read this file and write it in an another location, for example in the path \"D:\\Project\\\". How to do thi

相关标签:
2条回答
  • 2021-01-01 07:26

    The CreateFromFile methods create a memory-mapped file from an existing file on disk. The following example creates a memory-mapped view of a part of an extremely large file and manipulates a portion of it.

    using System;
    using System.IO;
    using System.IO.MemoryMappedFiles;
    using System.Runtime.InteropServices;
    
    class Program
    {
        static void Main(string[] args)
        {
            long offset = 0x10000000; // 256 megabytes 
            long length = 0x20000000; // 512 megabytes 
    
            // Create the memory-mapped file. 
            using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
            {
                // Create a random access view, from the 256th megabyte (the offset) 
                // to the 768th megabyte (the offset plus length). 
                using (var accessor = mmf.CreateViewAccessor(offset, length))
                {
                    int colorSize = Marshal.SizeOf(typeof(MyColor));
                    MyColor color;
    
                    // Make changes to the view. 
                    for (long i = 0; i < length; i += colorSize)
                    {
                        accessor.Read(i, out color);
                        color.Brighten(10);
                        accessor.Write(i, ref color);
                    }
                }
            }
        }
    }
    
    public struct MyColor
    {
        public short Red;
        public short Green;
        public short Blue;
        public short Alpha;
    
        // Make the view brighter. 
        public void Brighten(short value)
        {
            Red = (short)Math.Min(short.MaxValue, (int)Red + value);
            Green = (short)Math.Min(short.MaxValue, (int)Green + value);
            Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
            Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
        }
    }
    

    The following example opens the same memory-mapped file for another process.

    using System;
    using System.IO.MemoryMappedFiles;
    using System.Runtime.InteropServices;
    
    
    class Program
    {
        static void Main(string[] args)
        {
            // Assumes another process has created the memory-mapped file. 
            using (var mmf = MemoryMappedFile.OpenExisting("ImgA"))
            {
                using (var accessor = mmf.CreateViewAccessor(4000000, 2000000))
                {
                    int colorSize = Marshal.SizeOf(typeof(MyColor));
                    MyColor color;
    
                    // Make changes to the view. 
                    for (long i = 0; i < 1500000; i += colorSize)
                    {
                        accessor.Read(i, out color);
                        color.Brighten(20);
                        accessor.Write(i, ref color);
                    }
                }
            }
        }
    }
    
    public struct MyColor
    {
        public short Red;
        public short Green;
        public short Blue;
        public short Alpha;
    
        // Make the view brigher. 
        public void Brighten(short value)
        {
            Red = (short)Math.Min(short.MaxValue, (int)Red + value);
            Green = (short)Math.Min(short.MaxValue, (int)Green + value);
            Blue = (short)Math.Min(short.MaxValue, (int)Blue + value);
            Alpha = (short)Math.Min(short.MaxValue, (int)Alpha + value);
        }
    }
    

    You can also read more at :http://www.codeproject.com/Articles/138290/Programming-Memory-Mapped-Files-with-the-NET-Frame

    0 讨论(0)
  • 2021-01-01 07:26

    I can now achieve reading and writing a file using Memory Mapped File using the below coding:

    FileStream stream = File.OpenRead(@"D:\FFv1\dpx1\1.dpx");
    byte[] fileBytes = new byte[stream.Length];
    string Output = @"D:\Vanthiya Thevan\FFv1\dpx1\2.dpx";
    using (var fileStream = new FileStream(Output, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
    using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, "MapName", fileBytes.Length,
    MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true))
    {
        var viewStream = memoryMapped.CreateViewStream();
        viewStream.Write(fileBytes, 0, fileBytes.Length); 
    }
    
    0 讨论(0)
提交回复
热议问题