【问题标题】:Access Denied While Deleting .exe File删除 .exe 文件时访问被拒绝
【发布时间】: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


【解决方案1】:

发现问题在于文件被标记为“只读”,所以我在删除文件之前添加了一个 if 语句来检查它是否是,并在需要时删除标记。这是成功删除所有想要的文件的代码。

#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",
                                        @"ds_store",
                                        @"._.Trashes",
                                        @".Trashes",
                                        @".db",
                                        @".dat",
                                        @".sxw",
                                        @".ini",
                                        @".tif",
                                        @".tiff"
                                      };
    private static void RemoveBadFiles(DirectoryInfo directory)
    {
        DirectoryInfo[] dirs = null;
        FileInfo[] files = null;
        if (directory != null)
        {
            try
            {
                files = directory.GetFiles();
            }
            catch (IOException) { }
        }

        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)) || BadFiles.Contains(file.Name))
                    {
                        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 "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

感谢那些评论和帮助的人。并希望这可以在将来对其他人有所帮助。

【讨论】:

  • 考虑将BadFiles 变成HashSet<string>HashSet.Contains 将比 Array.Contains 快得多。 HashSet.Contains 进行直接查找而不是顺序搜索。这不会对该应用程序的运行速度产生任何影响,因为您的限制因素是磁盘 I/O 时间,但这是一个很好的常规做法。
猜你喜欢
  • 2023-03-14
  • 2014-10-19
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多