【发布时间】:2014-12-22 17:54:54
【问题描述】:
问题总结:
我有一个控制台应用程序,在将许多文件夹和文件复制到新位置(本地驱动器)后,它会删除某些文件/文件夹。它删除的其中一种文件类型是 .exe 文件。尝试删除所述文件时,它给了我一个拒绝访问错误。(尝试删除其他类型的文件和文件夹时也会发生这种情况)
其他说明:
我看到了几个问题,例如Unable to delete .exe file through c#. 但是,该进程从未在我的本地计算机上运行,也从未在复制它的源上运行。我既是我们域的本地管理员又是域管理员,并且我对我正在使用的目录中的所有文件夹和文件拥有所有权。但是在尝试从代码中删除文件时,它仍然拒绝我访问。但是,我可以手动删除此类文件/文件夹。(单击删除键)
问题:
如上所述,我正在寻找一种方法来解决这个问题,拒绝我删除这些“非法”文件类型并从我的代码中删除它们。
我的代码:(更新)
#region Delete_Illegal_Items
public static void RemoveIllegalItems()
{
Console.Clear();
DirectoryInfo Libraries = new DirectoryInfo(Library.DestinationMain);
try
{
foreach (var Lib in Libraries.GetDirectories())
{
Console.WriteLine("Working On {0}.", Lib.Name);
Parallel.Invoke(
() =>
{
RemoveBadFiles(Lib);
},
() =>
{
DeleteEmptyFolders(Lib);
}
);
}
}
catch (AggregateException e)
{
Console.WriteLine("There Was An Unusual Error During Initialization Of Library Correction:\n{0}", e.InnerException.ToString());
}
}
private static string[] BadFiles = {
@".hta",
@".exe",
@".lnk",
@".tmp",
@".config",
@".ashx",
@".hta.",
@".hta::$DATA",
@".zip",
@".asmx",
@".json",
@".soap",
@".svc",
@".xamlx",
@".msi",
@".ops",
@".pif",
@".shtm",
@".shtml",
@"smt",
@".vb",
@".vbe",
@".vbs",
@".ds_store",
@".db",
@".ini",
@".tiff"
};
private static void RemoveBadFiles(DirectoryInfo directory)
{
DirectoryInfo[] dirs = null;
FileInfo[] files = null;
if (directory != null)
{
files = directory.GetFiles();
}
try
{
dirs = directory.GetDirectories();
}
catch (IOException) { }
catch (Exception e)
{
Console.WriteLine("\nError During Enumeration Of Items To Delete:\n{0}", e.Message);
}
if (files != null)
{
foreach (var file in files)
{
try
{
if (file.IsReadOnly)
{
file.IsReadOnly = false;
}
if (BadFiles.Contains(Path.GetExtension(file.FullName)))
{
File.Delete(file.FullName);
}
}
catch (Exception e)
{
Console.WriteLine("\nError During Removal Or Illegal Files:\n" + e.Message);
}
}
}
if (dirs != null)
{
foreach (var dir in dirs)
{
switch (dir.Name)
{
case ".TemporaryItems":
{
try
{
Directory.Delete(dir.FullName);
}
catch { }
break;
}
case "AI_RecycleBin":
{
try
{
Directory.Delete(dir.FullName);
}
catch { }
break;
}
case ".ToRemove":
{
try
{
Directory.Delete(dir.FullName);
}
catch { }
break;
}
default:
{
break;
}
}
RemoveBadFiles(dir);
}
}
}
private static void DeleteEmptyFolders(DirectoryInfo directory)
{
Program Main = new Program();
try
{
DirectoryInfo[] dirs = directory.GetDirectories();
foreach (var subDirectory in dirs)
{
int sum = Library.CountLibrary(subDirectory.FullName);
if (sum == 0)
{
Directory.Delete(subDirectory.FullName);
}
DeleteEmptyFolders(subDirectory);
}
}
catch { }
}
#endregion
任何帮助将不胜感激。如果此问题已在其他地方直接回答,请随时在评论中提及。正如我上面所说,我一直在查看有关此问题的过去问题,但尚未找到解决方案。否则谢谢你的帮助。
【问题讨论】:
-
运行控制台应用程序的用户在系统上有哪些权限?控制台应用程序是否在创建这些文件?
-
它在我手下运行,文件正在从网络文件共享复制到我拥有本地管理员权限的本地驱动器。此外,文件共享和本地机器都在一个域内,我对我们域下的所有内容都具有完全的读/写访问权限。它没有创建任何东西,只是复制然后从复制的数据中删除。
-
哪一行导致异常?这适用于任何文件还是仅适用于特定文件?
-
是RemoveBadFiles方法下第一个foreach中的File.Delete(file.FullName)。异常本身是由 foreach 中的 try/catch 产生的,但这并不是我真正想要的,在这种情况下,我仍然需要删除文件。不是我注意到的。它从我手动删除的几个链接文件 (.lnk) 开始,然后在 .exe 文件上再次停止,我开始四处寻找另一个答案并打开了这个问题。
-
在查看文件属性时,我注意到它被标记为只读,这不会造成任何问题吗?
标签: c# .net access-denied