删除文件时拒绝访问

时间:2014-07-17 07:52:18

标签: c# asp.net file

我有一个服务(****。svc文件),可以将图像保存在应用程序文件夹中。

当我尝试从此文件夹中删除另一个图像文件(未使用)时,我得到“拒绝访问路径”。

foreach (string file in Directory.GetFiles(serverPath))
{
       File.Delete(file);
}

您知道为什么我可以写入此文件夹但无法从中删除吗?

3 个答案:

答案 0 :(得分:2)

试试这个:

FileInfo fi = new FileInfo(FileName); 
if (fi.IsReadOnly) 
      fi.IsReadOnly = false; 
fi.Delete(); 

答案 1 :(得分:1)

在创建FileStreams来编写文件时是否使用过“using”,或者在流/编写器实例上显式调用了close()?如果既不是第一个也不是最后一个,那么访问的文件可能会保持锁定状态,直到垃圾收集器清理那些超出范围的实例...

答案 2 :(得分:0)

因此,问题的答案显然是,该服务由与用户帐户不同的用户帐户运行,该帐户已登录系统。

这是WindowsServer平台上的常见问题,您必须为IUSR帐户授予IIS托管的应用程序权限。

去检测哪个帐户正在运行该服务,例如使用ManagementObjectSearcher。

来自here的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的引用,并添加使用此命名空间以使其工作,如果您有足够的信心。

它会产生所有进程,但您甚至可以修改查询,仅适用于您的应用程序的进程名称,但是我觉得这样就足够了。