【问题标题】:uwp streamwriter System.UnauthorizedAccessExceptionuwp streamwriter System.UnauthorizedAccessException
【发布时间】:2021-03-07 15:57:51
【问题描述】:

您好,我正在尝试在 UWP 中创建一个 txt 文件,但出现此错误: System.UnauthorizedAccessException:获取路径……

当我在控制台应用程序中使用代码时,它可以正常工作,但在 UWP 中却不行。 我尝试了 3 个位置来创建 txtfile。 AppData文件夹、U盘、项目文件夹

代码如下:

private void TextMethod()
{
    //string file = @"E:\Logfiles\test.txt";
    //string file = @"C:\Users\deeja\source\repos\UwpTxtTest\UwpTxtTest\bin\x86\Debug\test.txt";
    string file = @"C:\Users\deeja\AppData\test.txt";

    if (!File.Exists(file))
    {
        try
        {
            using (StreamWriter sw = new StreamWriter(file, true))
            {
                sw.WriteLine("Hello");
                sw.WriteLine();
                Debug.WriteLine("File created");
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine("Error = " + e);
        }
    }
    else Debug.WriteLine("File already exists");
}
  

【问题讨论】:

  • 这是help吗?
  • 您好。我已经尝试了一点,它可以很好地创建文件。但它将文件放在某个随机文件夹中。如果我不能让其他代码工作,我会再次接近这个。谢谢

标签: c# uwp streamwriter


【解决方案1】:

如果要在UWP平台访问带路径的文件,需要使用Windows Storage Api,并开启broadFileSystemAccess能力,然后在设置页面(设置->隐私->文件系统)开启应用访问文件系统- >选择哪些应用程序可以访问您的文件系统)。我在下面有编辑代码示例。

private async void TextMethod()
{
    //string file = @"E:\Logfiles\test.txt";
    //string file = @"C:\Users\deeja\source\repos\UwpTxtTest\UwpTxtTest\bin\x86\Debug\test.txt";
    string file = @"C:\Users\minghaoz\AppData\test.txt";
    try
    {
        var textFile = await StorageFile.GetFileFromPathAsync(file);
        if (file != null)
        {
            using (var outputStream = await textFile.OpenStreamForWriteAsync())
            {
                using (var sw = new StreamWriter(outputStream))
                {
                    sw.WriteLine("Hello");
                    sw.WriteLine();
                    Debug.WriteLine("File created");
                }
                outputStream.Dispose();
            }
        }

    }
    catch (Exception e)
    {
        Debug.WriteLine("Error = " + e);
       
        if (e.Message.Contains("0x80070002"))
        {
            var savePicker = new FileSavePicker();
            savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
            savePicker.SuggestedFileName = "test";
            savePicker.SuggestedStartLocation = PickerLocationId.ComputerFolder;
            StorageFile newFile = await savePicker.PickSaveFileAsync();
            if (newFile != null)
            {
                CachedFileManager.DeferUpdates(newFile);
                // write to file
                using (var outputStream = await newFile.OpenStreamForWriteAsync())
                {
                    using (var sw = new StreamWriter(outputStream))
                    {
                        sw.WriteLine("Hello");
                        sw.WriteLine();
                        Debug.WriteLine("File created");
                    }
                    outputStream.Dispose();
                }
                FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(newFile);
                if (status == FileUpdateStatus.Complete)
                {

                }
                else
                {

                }
            }
            else
            {

            }
        }
    }
}

更多信息请参考File access permissions文档。

【讨论】:

  • 嗨,尼科。感谢你的回复。我现在已经尝试了您的解决方案并阅读了包清单中的功能。我现在没有收到异常,但似乎 if (!File.Exists(file)) 部分不起作用?
  • .NET System.IO 类不能在你的包之外工作。您需要使用 WinRT API
  • @Daniel,Peter 的评论是正确的,File.Exists(file) 在上述情况下总是会返回 false,我已经更新了答案。
  • 谢谢它的工作。我不明白 catch 块中发生的一半情况,但我会调查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
相关资源
最近更新 更多