代码之家  ›  专栏  ›  技术社区  ›  jason_wun

如何在UWP中将IntPtr写入文件

  •  -1
  • jason_wun  · 技术社区  · 8 年前

    我试图报告MP3解码器的一个bug,开发人员让我生成PCM文件,以便他确定问题。

    这是我用来生成PCM文件的代码

    private async Task NewMethod()
        {
            var file = await SelectPlaybackFile();
            await Task.Run(() =>
            {
                _handle = Bass.BASS_StreamCreateFile(file.Path, 0,0,BASSFlag.BASS_STREAM_AUTOFREE | BASSFlag.BASS_SAMPLE_FLOAT);
                var _myDSPProc = new DSPPROC(Dsp1);
                int dspHandle = Bass.BASS_ChannelSetDSP(_handle, _myDSPProc, IntPtr.Zero, 0);
    
                Bass.BASS_ChannelPlay(_handle, false);
            });
    
        }
    
        unsafe void Dsp1(int handle, int channel, IntPtr buffer, int length, IntPtr user)
        {
        }
    

    我注意到缓冲区是一个非托管内存,我以前从未处理过它。所以我开始做一些研究并找到了答案 here 这是答案的密码

    private void callback(IntPtr buffer, int length)
    {
        FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
        int written;
        WriteFile(file.Handle, buffer, length, out written, IntPtr.Zero);
        file.Close();
    }
    
     [DllImport("kernel32.dll")]
     private static extern bool WriteFile(IntPtr hFile, IntPtr lpBuffer, int NumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);
    

    然而,上面的代码可能无法在UWP上运行,因为应用程序正在沙箱中运行,而开发人员无法访问路径。

    有没有其他方法可以帮助将IntPtr写入UWP中的文件?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Breeze Liu - MSFT    8 年前

    在UWP应用程序中,默认情况下,您可以访问某些文件系统位置,请参阅 File access permissions document

    您可以尝试以下代码。

    private async void Method(IntPtr buffer, int length)
    {
        StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("MyFile.txt", CreationCollisionOption.ReplaceExisting);
        var stream = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowReadersAndWriters);
        unsafe
        {
            UnmanagedMemoryStream ustream = new UnmanagedMemoryStream((byte*)buffer, length);
            ustream.CopyTo(stream.AsStream());
            ustream.Dispose();
            stream.Dispose();
        }
    }
    

    注意:在Visual Studio中,您应该选择 允许不安全代码 配置(右键单击项目=>选择生成选项卡=>选择允许不安全代码)。

    推荐文章