Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除文件时拒绝访问_C#_Asp.net_File - Fatal编程技术网

C# 删除文件时拒绝访问

C# 删除文件时拒绝访问,c#,asp.net,file,C#,Asp.net,File,我有一个将图像保存在应用程序文件夹中的服务(****.svc文件) 当我尝试从此文件夹中删除另一个未使用的图像文件时,我得到“对路径“”的访问被拒绝” 您知道为什么我可以写入此文件夹,但不能从中删除吗?您在创建文件流时是否使用了“使用”来写入文件,或者是否在流/写入器实例上显式调用了close()?如果不是第一个或最后一个,则访问的文件可能会保持锁定状态,直到垃圾收集器清除那些超出范围的实例…尝试以下操作: FileInfo fi = new FileInfo(FileName); if (f

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

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

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

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

尝试以下操作:

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

因此,您的问题的答案显然是,服务由不同的用户帐户运行,而不是与系统一起登录的用户帐户

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

Go、detect、哪个帐户正在运行该服务,例如使用ManagementObjectSearcher

这是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
的引用,并添加对该命名空间的使用,以使其正常工作


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

检查它是否在后台打开,使用TaskManager我最好的猜测是该文件正在使用中。写入只会创建新的(未使用)文件,所以这就是为什么这样做有效而删除不起作用的原因。保存文件时,请重新检查参数。可能您限制了文件的重复使用。我相信您具有删除权限并不意味着应用程序具有这些权限,因为它可能从不同的用户运行,例如,如果它是IIS托管的,您必须添加
IUSR
和相应的用户权限(例如,有时
NT AUTHORITY\NETWORKSERVICE
),现在我想您必须发现哪个帐户为您运行自托管服务,并仔细检查它是否授予了在app文件夹中删除的权限。您可以使用
ManagementObjectSearcher
进行此操作。在观察其他可能性之前,我首先要确定你在这一点上是正确的。根据请求编写代码导航到文件夹,单击鼠标右键,选择“属性”,单击“共享”选项卡,单击“共享”,从下拉列表中选择“所有人”,单击“添加”,将权限级别设置为“在所有人面前读/写”,然后单击“共享”按钮。这只是一种检查是否需要提升任何权限的方法。如果您确实需要这样做,应该按照@jmodrak所描述的那样进行。据我所知,只读不会影响删除。只读属性阻止您进行任何修改,因此不会删除too@PatrickHofman不,它不影响文件不是只读的…代码未输入if语句验证文件夹的属性使用“using”创建文件流时,请注意。。非常感谢。
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]));
        }
     }