为了账号安全,请及时绑定邮箱和手机立即绑定

File.Delete 上的 System.IO.DirectoryNotFound

File.Delete 上的 System.IO.DirectoryNotFound

C#
www说 2023-09-16 17:05:35
我编写了代码来递归删除文件夹及其所有结构。我从 获得了System.IO.DirectoryNotFoundException一个File.Delete有效的文件名Directory.GetFiles(path)。我File.Exists之前添加过,它告诉我该文件不存在,我也可以在资源管理器中看到它。我知道我可以做到,SHFileOperation应该可以正常工作。但我想使用本机 C#(没有直接的 Windows API)。我在 Windows 10 上红色:.NET 4.6.2 和长路径,并在本地组策略编辑器中设置启用“启用 Win 32 长路径”。我正在使用 .NET Framework 4.7.2。有谁能告诉我我的代码有什么问题吗?或者我能做些什么来让它发挥作用?错误的路径是:'E:\CobianBackupOld\cn1629\AppData\Local\Packages\Microsoft.Windows.Cortana_cw5n1h2txyewy\LocalState\AppIconCache\100\{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}_Microsoft Visual Studio 9_0_Application_PreEmptive Solutions_Dotfuscator Community Edition_dotfuscator _exe'我是该文件的所有者(我有权限删除它)。
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

虽然没有我希望的那么完美,但我通过使用前缀“\?\”并确保在删除之前将属性设置为正常来修复了我的错误。


我还是不明白为什么我还必须这样做???为什么它在最近的.net库中仍然没有修复?


最终代码:


using System;

using System.Diagnostics;

using System.IO;


namespace HQ.Util.General.IO

{

    public class DirectoryRemoverRecursive

    {

        private readonly Action<string, string, int> _pathStatus;

        private readonly Func<string, bool> _callbackCanRemoveFile;

        private readonly Func<string, bool> _callbackCanRemoveFolder;

        private Func<bool> _shouldCancel;


        public int Count { get; private set; } = 0;


        /// <summary>

        /// 

        /// </summary>

        /// <param name="pathStatus">Arguments are [path] and [null on success or exception message]</param>

        /// <param name="callbackCanRemoveFile">Argument is path and should return true to delete. If this function is null, all path will be deleted.</param>

        /// <param name="callbackCanRemoveFolder">Argument is path and should return true to delete. If this function is null, all path will be deleted.</param>

        /// <param name="shouldCancel">If null will never cancel. Cancel when func return true</param>

        public DirectoryRemoverRecursive(

            Action<string, string, int> pathStatus = null, 

            Func<string, bool> callbackCanRemoveFile = null, 

            Func<string, bool> callbackCanRemoveFolder = null, 

            Func<bool> shouldCancel = null)

        {

            _pathStatus = pathStatus;

            _callbackCanRemoveFile = callbackCanRemoveFile;

            _callbackCanRemoveFolder = callbackCanRemoveFolder;

            _shouldCancel = shouldCancel;

        }


        // ******************************************************************

        /// <summary>

        /// return true if canceled

        /// </summary>

        /// <param name="path"></param>

        /// <returns></returns>

        public bool Remove(string path)

        {

            string result = null;


            if (path.Length < 2 || !path.StartsWith(@"\\"))

            {

                path = @"\\?\" + path;

            }


            if (Directory.Exists(path))

            {

                foreach (var subDir in Directory.GetDirectories(path))

                {

                    if (_shouldCancel != null)

                    {

                        if (_shouldCancel())

                        {

                            return true;

                        }

                    }


                    if (Remove(subDir))

                    {

                        return true;

                    }

                }


                foreach (var filename in Directory.GetFiles(path))

                {

                    if (_shouldCancel != null)

                    {

                        if (_shouldCancel())

                        {

                            return true;

                        }

                    }


                    if (Remove(filename))

                    {

                        return true;

                    }

                }


                try

                {

                    if (_callbackCanRemoveFolder != null)

                    {

                        if (!_callbackCanRemoveFolder(path))

                        {

                            return false;

                        }

                    }


                    Directory.Delete(path);

                    Count++;

                    result = null;

                }

                catch (Exception ex)

                {

                    try

                    {

                        File.SetAttributes(path, FileAttributes.Normal);

                        Directory.Delete(path);

                        Count++;

                        result = null;

                    }

                    catch (Exception)

                    {

                        result = "Try to delete directory exception: " + ex.ToString();

                    }

                }

            }

            else

            {

                try

                {

                    if (File.Exists(path))

                    {

                        if (_callbackCanRemoveFile != null)

                        {

                            if (!_callbackCanRemoveFile(path))

                            {

                                return false;

                            }

                        }


                        File.Delete(path);

                        Count++;

                        result = null;

                    }

                    else

                    {

                        Debug.Print($"File does not exists {path}");

                    }

                }

                catch (Exception ex)

                {

                    try

                    {

                        File.SetAttributes(path, FileAttributes.Normal);

                        File.Delete(path);

                        Count++;

                        result = null;

                    }

                    catch (Exception)

                    {

                        result = "Try to delete file exception: " + ex.ToString();

                    }

                }

            }


            _pathStatus?.Invoke(path, result, Count);


            return false;

        }


        // ******************************************************************


    }


}



查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信