删除文件时拒绝访问
本文关键字:拒绝访问 文件 删除 | 更新日期: 2023-09-27 18:13:15
我有一个服务(****。SVC文件),用于将图像保存在应用程序文件夹中。
当我试图从这个文件夹中删除另一个图像文件(未使用)时,我得到"访问路径被拒绝"。
foreach (string file in Directory.GetFiles(serverPath))
{
File.Delete(file);
}
你知道为什么我可以在这个文件夹里写东西却不能删除吗?
try this:
FileInfo fi = new FileInfo(FileName);
if (fi.IsReadOnly)
fi.IsReadOnly = false;
fi.Delete();
您是否在创建FileStreams时使用"using"来写文件,或者您是否在流/写入器实例上显式调用close() ?如果既不是第一个也不是最后一个,那么被访问的文件可能保持锁定状态,直到垃圾收集器清除那些已经超出作用域的实例…
所以你的问题的答案显然是,服务是由不同的用户帐户运行的,而不是登录系统的用户帐户。
这是WindowsServer平台上的一个常见问题,您必须为IUSR
帐户授予iis托管的应用程序权限。
去检测哪个帐户正在运行服务,例如使用managentobjectsearcher。
这里的A.Moore的代码实现了这个功能
ManagementObjectSearcher Processes = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
foreach (ManagementObject Process in Processes.Get())
{
if (Process["ExecutablePath"] != null)
{
string ExecutablePath = Process["ExecutablePath"].ToString();
string[] OwnerInfo = new string[2];
Process.InvokeMethod("GetOwner", (object[])OwnerInfo);
Console.WriteLine(string.Format("{0}: {1}", System.IO.Path.GetFileName(ExecutablePath), OwnerInfo[0]));
}
}
从这个,你看到哪个用户运行你的服务,授予它正确的权限,问题就解决了;)
编辑:为此目的创建一个简单的控制台应用程序,如果您有足够的信心,您必须手动添加对System.Management
的引用并为该名称空间添加使用,以便它工作。
它生成所有进程,但您甚至可以修改查询,仅适用于您的应用程序的进程名,但我发现这样就足够了。