我对使用C#.NET的System.IO命名空间有点新意。所以请原谅我一些基本问题。
我正在编写一个在线界面,允许网站所有者修改服务器上的文件和目录。
我的System.IO.Directory.Delete(PathToDelete, true);
表现不一致。有时候效果很好,有时会抛出错误。我的控制器看起来像这样:
public ActionResult FileDelete(List<string> entity = null)
{
if (entity != null)
{
if (entity.Count() > 0)
foreach (string s in entity)
{
string CurrentFile = s.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
string FileToDelete = Server.MapPath(CurrentFile);
bool isDir = (System.IO.File.GetAttributes(FileToDelete) & FileAttributes.Directory) == FileAttributes.Directory;
if (isDir)
{
if (System.IO.Directory.Exists(FileToDelete))
{
//Problem line/////////////////////////////////
System.IO.Directory.Delete(FileToDelete, true);
}
}
else
{
if (System.IO.File.Exists(FileToDelete))
{
System.IO.File.Delete(FileToDelete);
string ThumbConfigDir = ConfigurationManager.AppSettings["ThumbnailSubdirectory"];
string ThumbFileToDelete = Path.GetDirectoryName(FileToDelete) + Path.DirectorySeparatorChar + ThumbConfigDir + Path.DirectorySeparatorChar + Path.GetFileName(FileToDelete);
if (System.IO.File.Exists(ThumbFileToDelete))
{
System.IO.File.Delete(ThumbFileToDelete);
}
}
}
}
}
return Redirect(HttpContext.Request.UrlReferrer.AbsoluteUri.ToString());
}
有时候,我会在删除以下内容时收到错误:
The directory is not empty.
Description: An unhandled exception occurred during the execution of the current
web request. Please review the stack trace for more information about the error
and where it originated in the code.
Exception Details: System.IO.IOException: The directory is not empty.
Source Error:
Line 137: if (System.IO.Directory.Exists(FileToDelete))
Line 138: {
Line 139: System.IO.Directory.Delete(FileToDelete, true);
Line 140: }
Line 141: }
我不确定我可以实施什么样的防御性编码来避免像这样的错误。有什么想法吗?我想通过说System.IO.Directory.Delete(FileToDelete, true);
答案 0 :(得分:1)
如果有正在使用的文件,则删除不会清空目录,然后在尝试删除目录时失败。
尝试使用FileInfo
而不是静态方法,并在对文件执行任何操作后使用“刷新”。 (或针对目标的目录信息)
答案 1 :(得分:0)
通常,您只需要从文件/文件夹操作代码中获得此类异常。有很多原因导致它可能发生 - 一些文件正在使用中,某些进程将工作文件夹设置为目录,某些文件由于权限而对您的进程不可见等等。
流程监控(http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)可能会显示导致问题的原因。
如果您自己为临时文件创建文件夹然后尝试删除它,常见的一个原因是忘记在这样的文件夹中处理与文件相关的Stream对象(可能是Reader和Writer objets的间接链接,XmlDocument)。 / p>