在 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();
    }
}

使用该方法时,出现以下异常:

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();
            }