diff --git a/build/Version.props b/build/Version.props index 49b065e..39a89eb 100644 --- a/build/Version.props +++ b/build/Version.props @@ -1,5 +1,5 @@ - 7.6.0 + 7.7.0 \ No newline at end of file diff --git a/src/Utils/Walterlv.IO.PackageManagement/PackageDirectory.cs b/src/Utils/Walterlv.IO.PackageManagement/PackageDirectory.cs index 88435f9..828eea6 100644 --- a/src/Utils/Walterlv.IO.PackageManagement/PackageDirectory.cs +++ b/src/Utils/Walterlv.IO.PackageManagement/PackageDirectory.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; using System.Linq; -using System.Text; - using Walterlv.IO.PackageManagement.Core; namespace Walterlv.IO.PackageManagement @@ -42,7 +39,8 @@ public static IOResult Move(string sourceDirectory, string targetDirectory, bool /// 目标文件夹。 /// 指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。 /// 包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。 - public static IOResult Move(string sourceDirectory, string targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) => Move( + public static IOResult Move(string sourceDirectory, string targetDirectory, + DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) => Move( VerifyDirectoryArgument(sourceDirectory, nameof(sourceDirectory)), VerifyDirectoryArgument(targetDirectory, nameof(targetDirectory)), overwrite); @@ -68,7 +66,8 @@ public static IOResult Copy(string sourceDirectory, string targetDirectory, bool /// 目标文件夹。 /// 指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。 /// 包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。 - public static IOResult Copy(string sourceDirectory, string targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) => Copy( + public static IOResult Copy(string sourceDirectory, string targetDirectory, + DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) => Copy( VerifyDirectoryArgument(sourceDirectory, nameof(sourceDirectory)), VerifyDirectoryArgument(targetDirectory, nameof(targetDirectory)), overwrite); @@ -131,7 +130,8 @@ public static IOResult Move(DirectoryInfo sourceDirectory, DirectoryInfo targetD /// 目标文件夹。 /// 指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。 /// 包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。 - public static IOResult Move(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) + public static IOResult Move(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, + DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) { if (sourceDirectory is null) { @@ -289,7 +289,8 @@ public static IOResult Copy(DirectoryInfo sourceDirectory, DirectoryInfo targetD /// 目标文件夹。 /// 指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。 /// 包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。 - public static IOResult Copy(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) + public static IOResult Copy(DirectoryInfo sourceDirectory, DirectoryInfo targetDirectory, + DirectoryOverwriteStrategy overwrite = DirectoryOverwriteStrategy.Overwrite) { if (sourceDirectory is null) { @@ -374,6 +375,12 @@ static void Delete(DirectoryInfo directory, int depth, IOResult logger) { JunctionPoint.Delete(directory.FullName); } +#if NET6_0_OR_GREATER + else if(directory.LinkTarget != null) + { + directory.Delete(); + } +#endif else if (!Directory.Exists(directory.FullName)) { return; @@ -444,21 +451,21 @@ private static IOResult DeleteIfOverwrite(DirectoryInfo targetDirectory, Directo switch (overwrite) { case DirectoryOverwriteStrategy.DoNotOverwrite: - { - logger.Log("目标目录已经存在,但是要求不被覆盖,抛出异常。"); - throw new IOException($"目标目录“{targetDirectory.FullName}”已经存在,如要覆盖,请设置 {nameof(overwrite)} 为 true。"); - } + { + logger.Log("目标目录已经存在,但是要求不被覆盖,抛出异常。"); + throw new IOException($"目标目录“{targetDirectory.FullName}”已经存在,如要覆盖,请设置 {nameof(overwrite)} 为 true。"); + } case DirectoryOverwriteStrategy.Overwrite: - { - logger.Log("目标目录已经存在,删除。"); - var deleteResult = Delete(targetDirectory.FullName); - logger.Append(deleteResult); - } + { + logger.Log("目标目录已经存在,删除。"); + var deleteResult = Delete(targetDirectory.FullName); + logger.Append(deleteResult); + } break; case DirectoryOverwriteStrategy.MergeOverwrite: - { - // 如果是合并式覆盖,那么不需要删除,也不需要抛异常,直接覆盖即可。 - } + { + // 如果是合并式覆盖,那么不需要删除,也不需要抛异常,直接覆盖即可。 + } break; default: break; @@ -467,7 +474,8 @@ private static IOResult DeleteIfOverwrite(DirectoryInfo targetDirectory, Directo return logger; } - private static void MoveFileWithConflictionResolver(DirectoryInfo targetDirectory, FileInfo sourceFile, FileInfo targetFile, Action conflictionResolver) + private static void MoveFileWithConflictionResolver(DirectoryInfo targetDirectory, FileInfo sourceFile, FileInfo targetFile, + Action conflictionResolver) { var resolver = new FileMergeResolvingInfo(targetDirectory, targetFile); for (var i = 0; i < ushort.MaxValue; i++) diff --git a/src/Utils/Walterlv.IO.PackageManagement/Walterlv.IO.PackageManagement.csproj b/src/Utils/Walterlv.IO.PackageManagement/Walterlv.IO.PackageManagement.csproj index 1c94dae..45c8dde 100644 --- a/src/Utils/Walterlv.IO.PackageManagement/Walterlv.IO.PackageManagement.csproj +++ b/src/Utils/Walterlv.IO.PackageManagement/Walterlv.IO.PackageManagement.csproj @@ -1,7 +1,7 @@  - netcoreapp3.0;netstandard2.0;net45 + net6.0;netcoreapp3.0;netstandard2.0;net45 Walterlv.IO.PackageManagement is a tool for you to manage packages. It manage a directory with many versions of sub-directories and a current Junction Point linked to one of them. diff --git a/src/Utils/Walterlv.Logger/ILogger.cs b/src/Utils/Walterlv.Logger/ILogger.cs index 489639f..1a8c2cb 100644 --- a/src/Utils/Walterlv.Logger/ILogger.cs +++ b/src/Utils/Walterlv.Logger/ILogger.cs @@ -26,14 +26,14 @@ public interface ILogger void Message(string text, [CallerMemberName] string? callerMemberName = null); /// - /// 如果方法进入了非预期的分支,请调用此方法以便在日志文件中高亮显示。 + /// 如果方法进入了非预期的分支,请调用此方法以便在记录可高亮显示的日志。 /// /// 描述当前进入的代码分支。 /// 编译器自动传入。 void Warning(string message, [CallerMemberName] string? callerMemberName = null); /// - /// 在单独的日志文件中记录异常,并同时在普通的日志文件中插入一段高亮显示的日志。 + /// 单独记录异常。 /// 请注意,并不是所有的异常都需要调用此方法记录,此方法仅仅记录非预期的异常。 /// /// 对当前异常的文字描述。 @@ -42,7 +42,7 @@ public interface ILogger void Error(string message, Exception? exception = null, [CallerMemberName] string? callerMemberName = null); /// - /// 在单独的日志文件中记录异常,并同时在普通的日志文件中插入一段高亮显示的日志。 + /// 单独记录异常。 /// 请注意,并不是所有的异常都需要调用此方法记录,此方法仅仅记录非预期的异常。 /// /// 异常实例。 @@ -51,7 +51,7 @@ public interface ILogger void Error(Exception exception, string? message = null, [CallerMemberName] string? callerMemberName = null); /// - /// 在单独的日志文件中记录一条导致致命性错误的异常,并同时在普通的日志文件中插入一段高亮显示的致命错误标记。 + /// 单独记录导致致命性错误的异常。 /// 请注意,仅在全局区域记录此异常,全局区域如果还能收到异常说明方法内部有未处理的异常。 /// /// 异常实例。 diff --git a/src/Utils/Walterlv.Logger/IO/TextFileLogger.cs b/src/Utils/Walterlv.Logger/IO/TextFileLogger.cs index 642af94..fdaa599 100644 --- a/src/Utils/Walterlv.Logger/IO/TextFileLogger.cs +++ b/src/Utils/Walterlv.Logger/IO/TextFileLogger.cs @@ -73,6 +73,11 @@ public TextFileLogger(FileInfo infoLogFile, FileInfo errorLogFile, string lineEn _errorLogFile = areSameFile ? infoLogFile : errorLogFile; } + /// + /// 获取或设置一个值,指示在记录错误日志时,是否同时在信息日志上对此错误进行高亮显示。 + /// + public bool HighlightErrorsOnInfo { get; set; } = true; + /// /// 请求在写入首条日志前针对日志文件执行一些代码。代码可能在任一线程中执行,但确保不会并发。 /// @@ -133,7 +138,10 @@ protected sealed override void OnLogReceived(in LogContext context) if (!areSameFile && context.CurrentLevel <= LogLevel.Error) { // 写入日志的主要部分。 - CriticalWrite(infoMutex, _infoLogFile, BuildLogText(in context, containsExtraInfo: false, _lineEnd)); + if (HighlightErrorsOnInfo) + { + CriticalWrite(infoMutex, _infoLogFile, BuildLogText(in context, containsExtraInfo: false, _lineEnd)); + } // 写入日志的扩展部分。 CriticalWrite(errorMutex, _errorLogFile, BuildLogText(in context, context.ExtraInfo != null, _lineEnd));