我的应用程序对任何文件夹都没有权限

My application has no rights on any folder

我在 VS2015 中创建了一个 UWP 应用程序并将其部署到我的 windows 10 物联网设备 (RPI 3)。

已部署到此文件夹:

C:\Data\Users\DefaultAccount\AppData\Local\DevelopmentFiles\

现在运行时,它没有文件访问权限。 我尝试在 its own directory 中写入,从 c:\data 中读取,从 c:\mydir 中读取(新创建的,赋予每个用户完全访问权限)但没有读取(或写入)的权限.

奇怪的是,所有用于查看我的应用程序在哪个帐户下的代码示例 运行 不适用于物联网应用程序。

I've tried to write in its own directory

The app's install directory is a read-only location.

to read from c:\data, to read from c:\mydir (newly created, given every user full access rights) but no rights to read (or write).

Not all folders on your device are accesible by Universal Windows Apps. To make a folder accesible to a UWP app, you can use FolderPermissions tool. For example run FolderPermissions c:\test -e to give UWP apps access to c:\test folder. Note this will work only with native Win32 apis for eg. CreateFile2 and not with WinRT apis like StorageFolder, StorageFile etc.

要使用 Win32 api ReadFile,您需要使用 PInvoke。代码如下:

    /*Part1: preparation for using Win32 apis*/
    const uint GENERIC_READ = 0x80000000;
    const uint OPEN_EXISTING = 3;
    System.IntPtr handle;

    [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
    static extern unsafe System.IntPtr CreateFile
    (
        string FileName,          // file name
        uint DesiredAccess,       // access mode
        uint ShareMode,           // share mode
        uint SecurityAttributes,  // Security Attributes
        uint CreationDisposition, // how to create
        uint FlagsAndAttributes,  // file attributes
        int hTemplateFile         // handle to template file
    );

    [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
    static extern unsafe bool ReadFile
    (
        System.IntPtr hFile,      // handle to file
        void* pBuffer,            // data buffer
        int NumberOfBytesToRead,  // number of bytes to read
        int* pNumberOfBytesRead,  // number of bytes read
        int Overlapped            // overlapped buffer
    );

    [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
    static extern unsafe bool CloseHandle
    (
        System.IntPtr hObject // handle to object
    );

    public bool Open(string FileName)
    {
        // open the existing file for reading       
        handle = CreateFile
        (
            FileName,
            GENERIC_READ,
            0,
            0,
            OPEN_EXISTING,
            0,
            0
        );

        if (handle != System.IntPtr.Zero)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public unsafe int Read(byte[] buffer, int index, int count)
    {
        int n = 0;
        fixed (byte* p = buffer)
        {
            if (!ReadFile(handle, p + index, count, &n, 0))
            {
                return 0;
            }
        }
        return n;
    }

    public bool Close()
    {
        return CloseHandle(handle);
    }
    /*End Part1*/

    /*Part2: Test reading */
    private void ReadFile()
    {
        string curFile = @"c:\test\mytest.txt";

        byte[] buffer = new byte[128];


        if (Open(curFile))
        {
            // Assume that an ASCII file is being read.
            System.Text.ASCIIEncoding Encoding = new System.Text.ASCIIEncoding();

            int bytesRead;
            do
            {
                bytesRead = Read(buffer, 0, buffer.Length);
                string content = Encoding.GetString(buffer, 0, bytesRead);
                System.Diagnostics.Debug.WriteLine("{0}", content);
            }
            while (bytesRead > 0);

            Close();
        }
        else
        {
            System.Diagnostics.Debug.WriteLine("Failed to open requested file");
        }

    }
    /*End Part2*/

注意:这里有一些 不安全 代码可能不会发布到商店。但是如果你只是在 Windows IoT core 上使用它就不会打扰你。