如何将IntPtr写入UWP中的文件

时间:2018-04-26 20:50:34

标签: uwp windows-10 bass

我正在尝试报告MP3解码器的错误,开发人员让我为他生成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上运行,因为应用程序在沙箱中运行,并且dev无法访问路径。

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

1 个答案:

答案 0 :(得分:0)

在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中,您应该选择允许不安全的代码配置。(右键单击您的项目=>选择构建选项卡=>选择允许不安全的代码)。