如何将 IntPtr 写入 UWP 中的文件
How to write IntPtr to a file in UWP
我想报告一个 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 上运行,因为该应用 运行 在沙箱中并且开发人员无法访问路径。
有没有其他方法可以帮助将 IntPtr 写入 UWP 中的文件?
在 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中,你应该select允许不安全代码配置。(右键单击你的项目=>Select构建tab=>Select 允许不安全代码)。
我想报告一个 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 上运行,因为该应用 运行 在沙箱中并且开发人员无法访问路径。
有没有其他方法可以帮助将 IntPtr 写入 UWP 中的文件?
在 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中,你应该select允许不安全代码配置。(右键单击你的项目=>Select构建tab=>Select 允许不安全代码)。