2016-12-17 6 views
0

Я создал приложение UWP в VS2015 и развернул его на своем устройстве IOT 10 IOT (RPI 3).Мое приложение не имеет прав на какую-либо папку

Он развертывается в папку:

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

Теперь, когда он работает, он не имеет права доступа к файлам. Я попытался написать в its own directory, чтобы прочитать от c:\data, чтобы читать от c:\mydir (только что созданный, учитывая права каждого пользователя на полный доступ), но не имеет права читать (или писать).

Странно, что все примеры кода, чтобы увидеть, под какой учетной записью работает мое приложение, недоступны для iot-приложений.

+0

Ничего себе, не знаю, окна IoT поддерживают WPF, как вы это сделали? – Jackie

+0

Это стартовый проект. Нажмите кнопку, и светодиод идет вперед и назад. – Michel

+0

Я думал, что окна IoT поддерживают только UWP, не знаю, WPF работает на Windows IoT. – Jackie

ответ

1

Я пытался писать в своем собственном каталоге

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

читать из C: \ данные, чтобы читать из C: \ MYDIR (вновь созданный, учитывая каждый пользователь имеет полный доступ), но не имеет права читать (или писать).

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.