c#执行File.Copy时出现unauthorizedAccessException异常
本文关键字:unauthorizedAccessException 异常 执行 File Copy | 更新日期: 2023-09-27 18:06:02
我正在尝试将文件从客户端复制到具有共享驱动器的服务器。当我这样做的时候,我得到了UnauthorizedAccessException
,它说对我试图复制的路径的访问被拒绝。这很奇怪,因为我有所有的权限,我是作为管理员登录的。奇怪的是,当写入服务器上相同路径上的文本文件时,它可以工作。这样的:
FileStream fs = new FileStream(@"''SIMON-VAIO'SimonShared'Users'Simon'Desktop'Files'Clients'clients.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (StreamReader sr = new StreamReader(fs))
{
while (sr.Peek() >= 0) //as long as there are characters to read
{
ListViewItem lvwItem = new ListViewItem();
lvwItem.Text = sr.ReadLine();
AddListViewItem(lvwItem);
}
sr.Close();
}
但是当执行复制方法时,我得到了这个异常。下面是我的复制方法:
FileInfo file = new FileInfo(sourcePath);
string newPath = targetPath + "''" + file.Name;
File.Copy(sourcePath, newPath, true);
所以我输入整个路径,包括源和目标的文件名和扩展名。
我试过像"File.SetAttributes(dest, FileAttributes.Normal);
"这样的东西,以及服务器上的一切,比如地图上的安全等。
你知道怎么回事吗?我将非常感谢你的帮助!
Thanks in advance
您可能对该文件有读/写权限,但对文件夹本身没有。这就是为什么你不能在那个位置创建新文件的原因之一。
还请记住,如果您启用了UAC,应用程序将不会"继承"您的管理权限,除非您明确地赋予它们(通过以管理员身份运行)
由于这些问题,可能会发生特定的问题:
- 对驱动器的无效访问
- 对文件夹 的无效访问
- 覆盖或移动文件无效。
根据路径位置,我认为这是另一台计算机。您必须确保它满足执行任务所需的可访问性要求。
您可以通过几种不同的方式完成此操作:
- 为适当的提升权限编写测试。
- 试图让您的程序模拟管理员或网络服务帐户。
- 您可以在尝试与之交互之前查询权限。
有几种方法可以做到这一点。
您甚至可以针对UAC进行测试:
WindowsIdenetity user = WindowsIdentity.GetCurrent();
WindowsPrincipal role = new WindowsPrincipal(user);
if (Environment.OSVersion.Platform == PlatformId.Win32NT) && (Environment.OSVersion.Version.Major > 6)
{
if(!(String.NullOrEmpty(user.ToString())))
{
if(role.IsInRole(WindowsBuiltInRole.Administrator)
{
// Good
}
}
}
这将是一种实际验证你在合适的角色的方法;如果没有,那么你实际上可以写一个MessageBox
或其他方式来表示权限不足。
你甚至可以查询目录:
string remotePath = @"''SomeLocation";
bool IsAccess = false;
DirectoryInfo di = new DirectoryInfo(remotePath);
if(di.Exists)
{
try
{
var acl = di.GetAccessControl();
IsAccess= true;
}
catch(UnauthorizedAccessException ex)
{
if(ex.Message.Contains("read-only"))
{
IsAccess = true;
}
else
{
// No Access Fail, do something else.
}
}
}
如你所见,在这种情况下你有相当大的灵活性。
我很抱歉,伙计们,但问题是,当我第一次共享驱动器时,我忘记将权限更改为"完全控制",并且只有读取权限。这使得计算机除了在共享网络上读取之外,不可能做任何事情。再次对不起,是我的错!无论如何,我真的很感激你的帮助,谢谢!