在 uwp 中使用 WaveFileReader(NAudio) 拒绝访问文件路径
Acces to file path denied using WaveFileReader(NAudio) in uwp
正在尝试使用以下方法将音频文件合并为一个:
byte[] buffer = new byte[1024];
WaveFileWriter waveFileWriter = null;
try
{
foreach (string sourceFile in sourceFiles)
{
WaveFileReader reader=null;
using ( reader = new WaveFileReader(sourceFile))
{
if (waveFileWriter == null)
{
// first time in create new Writer
waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat);
}
else
{
if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat))
{
throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format");
}
}
int read;
while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
{
waveFileWriter.WriteData(buffer, 0, read);
}
}
}
}
finally
{
if (waveFileWriter != null)
{
waveFileWriter.Dispose();
}
}
- outputFile:合并文件名;
- sourceFiles:音频文件路径的字符串列表;
使用该方法时,出现以下异常:
System.UnauthorizedAccessException: "Access to the path 'C:\Users\User\Documents\Gebura battle_541f3d9f-a4b9-4491-b6b6-75ede45e1748.wav' is denied."
我尝试 运行 visual studio 作为管理员,但没有用。我应该怎么做才能让它发挥作用?
我检查了WaveFileReader的源代码,它使用File.OpenRead
方法通过路径打开文件。不允许在 UWP 应用程序中将 IO/File APIs 与 Path 一起使用,因为 UWP 应用程序在沙箱中是隔离的。这就是这种行为的原因。如果您想在 UWP 应用程序中使用此 API,您可能需要联系 NAudio 的作者并更改 WaveFileReader
.
的源代码
如果有人遇到同样的问题,我已经找到了解决方案
首先,出于某种原因,UWP 只允许您在设置的目录中创建文件(ApplicationData.Current 包含允许的文件夹)。您还可以阅读和编辑文件,但仅限于 KnownFolders 文件夹或 ApplicatioData.Current 文件夹中。因此,如果您需要在 thoose 文件夹中创建文件并使用 StorageFile.MoveAsync(StorageFolder destinationFolderPath) 移动它们;出于某种原因,您可以将文件从 thoose 文件夹移动到其他文件夹
移动一些文件的例子:
try
{
StorageFile WhereTo = await KnownFolders.DocumentsLibrary.GetFileAsync("SavingFolderAudioCutter.txt"); // this file contains a path to a folder
string oof = await Windows.Storage.FileIO.ReadTextAsync(WhereTo); //getting a path
StorageFolder dest = await StorageFolder.GetFolderFromPathAsync(oof); //setting StorageFolder path from a string
string path = ApplicationData.Current.TemporaryFolder.Path + $@"\{uniqueName}.wav"; // setting a name for a moved file
StorageFile FromWhere = await StorageFile.GetFileFromPathAsync(path); // Original file location
await FromWhere.MoveAsync(dest);
UtilityFunctions.DeleteFilesFromDir(ApplicationData.Current.TemporaryFolder.Path); // Deleting files from a temporary folder
FileList.Items.Clear();
}
catch
{
MessageDialog dialog = new MessageDialog("The folder is read-only or incorrect choosen path");
await dialog.ShowAsync();
}
正在尝试使用以下方法将音频文件合并为一个:
byte[] buffer = new byte[1024];
WaveFileWriter waveFileWriter = null;
try
{
foreach (string sourceFile in sourceFiles)
{
WaveFileReader reader=null;
using ( reader = new WaveFileReader(sourceFile))
{
if (waveFileWriter == null)
{
// first time in create new Writer
waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat);
}
else
{
if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat))
{
throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format");
}
}
int read;
while ((read = reader.Read(buffer, 0, buffer.Length)) > 0)
{
waveFileWriter.WriteData(buffer, 0, read);
}
}
}
}
finally
{
if (waveFileWriter != null)
{
waveFileWriter.Dispose();
}
}
- outputFile:合并文件名;
- sourceFiles:音频文件路径的字符串列表;
使用该方法时,出现以下异常:
System.UnauthorizedAccessException: "Access to the path 'C:\Users\User\Documents\Gebura battle_541f3d9f-a4b9-4491-b6b6-75ede45e1748.wav' is denied."
我尝试 运行 visual studio 作为管理员,但没有用。我应该怎么做才能让它发挥作用?
我检查了WaveFileReader的源代码,它使用File.OpenRead
方法通过路径打开文件。不允许在 UWP 应用程序中将 IO/File APIs 与 Path 一起使用,因为 UWP 应用程序在沙箱中是隔离的。这就是这种行为的原因。如果您想在 UWP 应用程序中使用此 API,您可能需要联系 NAudio 的作者并更改 WaveFileReader
.
如果有人遇到同样的问题,我已经找到了解决方案 首先,出于某种原因,UWP 只允许您在设置的目录中创建文件(ApplicationData.Current 包含允许的文件夹)。您还可以阅读和编辑文件,但仅限于 KnownFolders 文件夹或 ApplicatioData.Current 文件夹中。因此,如果您需要在 thoose 文件夹中创建文件并使用 StorageFile.MoveAsync(StorageFolder destinationFolderPath) 移动它们;出于某种原因,您可以将文件从 thoose 文件夹移动到其他文件夹 移动一些文件的例子:
try
{
StorageFile WhereTo = await KnownFolders.DocumentsLibrary.GetFileAsync("SavingFolderAudioCutter.txt"); // this file contains a path to a folder
string oof = await Windows.Storage.FileIO.ReadTextAsync(WhereTo); //getting a path
StorageFolder dest = await StorageFolder.GetFolderFromPathAsync(oof); //setting StorageFolder path from a string
string path = ApplicationData.Current.TemporaryFolder.Path + $@"\{uniqueName}.wav"; // setting a name for a moved file
StorageFile FromWhere = await StorageFile.GetFileFromPathAsync(path); // Original file location
await FromWhere.MoveAsync(dest);
UtilityFunctions.DeleteFilesFromDir(ApplicationData.Current.TemporaryFolder.Path); // Deleting files from a temporary folder
FileList.Items.Clear();
}
catch
{
MessageDialog dialog = new MessageDialog("The folder is read-only or incorrect choosen path");
await dialog.ShowAsync();
}