【问题标题】:How to solve the problem of Permission denied while reading a file from UWP application?如何解决从 UWP 应用程序读取文件时权限被拒绝的问题?
【发布时间】:2019-08-29 10:47:23
【问题描述】:

我正在尝试在 UWP 应用程序中读取 C 或 D 驱动器的 .txt 文件。没关系,当我在资产中声明文件名的局部变量时。但它也被归档以从其他目录或驱动器读取文件。

我已经尝试过如下代码部分:

try
{
    String FileName = "C:\Users\abc\Documents\file.txt";
    // Read the file and display it line by line.  
    string[] lines = File.ReadAllLines(FileName);
    foreach (string inputLine in lines)
    {
        List<String> dummyList = new List<String>();
        String[] lineList = inputLine.Split(", ");

        foreach (var item in lineList)
        {
            dummyList.Add(item);
            //Debug.WriteLine(item);
        }
        mainList.Add(dummyList);
    }

    //file.Close();
}
catch (Exception ex)
{
    Debug.WriteLine("[DEBUG] " + ex);
}

“file.txt”对所有用户和应用程序都具有本地读取和写入权限。它是从 windows 中的 file.txt 属性完成的。

异常如下:

System.UnauthorizedAccessException: Access to the path 'C:\Users\abc\Documents\file.txt' is denied.
   at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle)
   at System.IO.FileStream.CreateFileOpenHandle(FileMode mode, FileShare share, FileOptions options)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
   at System.IO.File.InternalReadAllLines(String path, Encoding encoding)
   at Localizer.Data.StringDataText.StringDataInitialize()

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    正如 Adam McMahon 所说,UWP 应用是沙盒应用,不会直接访问外部环境中的文件。文件权限可以查看这个document

    具体到您提供的示例,您可以使用 FileOpenPicker 选择一个文本文件并从获取的 StorageFile 中读取内容。

    这个例子供参考:

    public async static Task<StorageFile> OpenLocalFile(params string[] types)
    {
        var picker = new FileOpenPicker();
        picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        Regex typeReg = new Regex(@"^\.[a-zA-Z0-9]+$");
        foreach (var type in types)
        {
            if (type == "*" || typeReg.IsMatch(type))
                picker.FileTypeFilter.Add(type);
            else
                throw new InvalidCastException("Invalid extension");
        }
        var file = await picker.PickSingleFileAsync();
        if (file != null)
            return file;
        else
            return null;
    }
    

    用法

    var txtFile=await OpenLocalFile(".txt");
    if(txtFile!=null)
    {
        var lines = FileIO.ReadLinesAsync(txtFile);
        // ... Other code
    }
    

    最好的问候。

    【讨论】:

      【解决方案2】:

      您收到此异常是因为 UWP 已被沙盒化,默认情况下您无权访问该位置。 See here 获取您可以默认访问的位置的完整列表。

      如果您绝对需要对更多位置进行更高级别的访问,那么您唯一的选择是使用broadFileSystemAccess(在上面的链接中也有引用)。如果您要侧载,这将是一个不错的选择,但如果您要上传应用商店,那么您可能会遇到大量问题。

      结论:这完全取决于您的需求,但如果文件仅由您的应用读取/写入,那么最好的选择是将其复制到您的应用LocalFolder

      【讨论】:

        【解决方案3】:

        您无权从 C 盘或 D 盘访问该文件。 这样做

        1. 您需要将文件复制到项目文件夹(将其拖放到您的项目中)

        2. 那么你就可以使用这段代码来访问文件了

        Windows.Storage.StorageFile sampleFile = await storageFolder.GetFileAsync("sample.txt");

        如果你想随机选择你的文件,那么我建议你使用FilePicker 点击here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-08
          相关资源
          最近更新 更多