我的应用程序对任何文件夹都没有权限
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).
要使用 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 上使用它就不会打扰你。
我在 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).
要使用 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 上使用它就不会打扰你。