0

有没有办法获得内存流的“路径”?例如,如果我想使用 CMD 并指向一个文件路径,例如“C:...”,但该文件位于内存流中,是否可以将其指向那里?

我试过搜索它,但我找不到任何明确的信息。

编辑:

如果有帮助,我想要访问的是一个图像文件,一个像这样的打印屏幕:

        using (Bitmap b = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height))
        {
            using (Graphics g = Graphics.FromImage(b))
            {
                g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            }
            using (MemoryStream ms = new MemoryStream())
            {
                b.Save(ms, ImageFormat.Bmp);
                StreamReader read = new StreamReader(ms);
                ms.Position = 0;
                var cwebp = new Process
                {
                    StartInfo =
                    {
                        WindowStyle = ProcessWindowStyle.Normal,
                        FileName = "cwebp.exe",
                        Arguments = string.Format(
                            "-q 100 -lossless -m 6 -alpha_q 100 \"{0}\" -o \"{1}\"", ms, "C:\test.webp")
                    },
                };
                cwebp.Start();
            }

        }

然后进行一些随机测试以使其正常工作....

我想把它传递给 cwebp,一个 Webp 编码器。这就是为什么我必须使用 CMD,因为我不能在 C# 级别使用它,否则我不会有这个问题。

4

3 回答 3

0

如果cwebp.exe需要一个文件名,则您可以在命令行上放置任何满足您条件的内容。任何足够像外部程序可以打开的文件的东西都无法从程序的内存中获取其数据。有几种可能性,但它们可能都需要更改cwebp.exe

  • 您可以写入新流程的标准
  • 您可以创建一个命名管道,该进程可以从中读取您的数据
  • 您可以创建一个命名的共享内存对象,其他进程可以从中读取

您还没有说明为什么要避免写入文件,因此很难说哪个最好。

于 2013-11-12T00:27:52.723 回答
0

是的,这通常是受保护的。如果你知道它在哪里,你也许可以用一个不安全的指针来抓取它。将其写入 cmd 可以读取的文本文件或将其推送到控制台读取可能更容易。

于 2013-11-11T18:10:53.237 回答
0

如果使用 .NET 4.0 或更高版本,您可以使用MemoryMappedFile。从 4.0 beta 开始我就没有玩过这个类。但是,我的理解对于在处理大量数据或需要某种程度的应用程序内存共享的情况下将内存写入磁盘很有用。

每个MSDN的用法:

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);
                }
            }
        }
    }
于 2013-11-11T18:19:19.577 回答