Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

删除文件夹时,支持符号链接的删除 #40

Merged
merged 3 commits into from
Apr 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build/Version.props
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<Version>7.6.0</Version>
<Version>7.7.0</Version>
</PropertyGroup>
</Project>
48 changes: 28 additions & 20 deletions src/Utils/Walterlv.IO.PackageManagement/PackageDirectory.cs
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -42,7 +39,8 @@ public static IOResult Move(string sourceDirectory, string targetDirectory, bool
/// <param name="targetDirectory">目标文件夹。</param>
/// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param>
/// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns>
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);
Expand All @@ -68,7 +66,8 @@ public static IOResult Copy(string sourceDirectory, string targetDirectory, bool
/// <param name="targetDirectory">目标文件夹。</param>
/// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param>
/// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns>
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);
Expand Down Expand Up @@ -131,7 +130,8 @@ public static IOResult Move(DirectoryInfo sourceDirectory, DirectoryInfo targetD
/// <param name="targetDirectory">目标文件夹。</param>
/// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param>
/// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns>
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)
{
Expand Down Expand Up @@ -289,7 +289,8 @@ public static IOResult Copy(DirectoryInfo sourceDirectory, DirectoryInfo targetD
/// <param name="targetDirectory">目标文件夹。</param>
/// <param name="overwrite">指定当目标路径存在现成现成文件夹时,应该如何覆盖目标文件夹。</param>
/// <returns>包含执行成功和失败的信息,以及中间执行中方法自动决定的一些细节。</returns>
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)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -467,7 +474,8 @@ private static IOResult DeleteIfOverwrite(DirectoryInfo targetDirectory, Directo
return logger;
}

private static void MoveFileWithConflictionResolver(DirectoryInfo targetDirectory, FileInfo sourceFile, FileInfo targetFile, Action<FileMergeResolvingInfo> conflictionResolver)
private static void MoveFileWithConflictionResolver(DirectoryInfo targetDirectory, FileInfo sourceFile, FileInfo targetFile,
Action<FileMergeResolvingInfo> conflictionResolver)
{
var resolver = new FileMergeResolvingInfo(targetDirectory, targetFile);
for (var i = 0; i < ushort.MaxValue; i++)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netcoreapp3.0;netstandard2.0;net45</TargetFrameworks>
<TargetFrameworks>net6.0;netcoreapp3.0;netstandard2.0;net45</TargetFrameworks>
<Description>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.</Description>
</PropertyGroup>

Expand Down
8 changes: 4 additions & 4 deletions src/Utils/Walterlv.Logger/ILogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ public interface ILogger
void Message(string text, [CallerMemberName] string? callerMemberName = null);

/// <summary>
/// 如果方法进入了非预期的分支,请调用此方法以便在日志文件中高亮显示
/// 如果方法进入了非预期的分支,请调用此方法以便在记录可高亮显示的日志
/// </summary>
/// <param name="message">描述当前进入的代码分支。</param>
/// <param name="callerMemberName">编译器自动传入。</param>
void Warning(string message, [CallerMemberName] string? callerMemberName = null);

/// <summary>
/// 在单独的日志文件中记录异常,并同时在普通的日志文件中插入一段高亮显示的日志
/// 单独记录异常
/// 请注意,并不是所有的异常都需要调用此方法记录,此方法仅仅记录非预期的异常。
/// </summary>
/// <param name="message">对当前异常的文字描述。</param>
Expand All @@ -42,7 +42,7 @@ public interface ILogger
void Error(string message, Exception? exception = null, [CallerMemberName] string? callerMemberName = null);

/// <summary>
/// 在单独的日志文件中记录异常,并同时在普通的日志文件中插入一段高亮显示的日志
/// 单独记录异常
/// 请注意,并不是所有的异常都需要调用此方法记录,此方法仅仅记录非预期的异常。
/// </summary>
/// <param name="exception">异常实例。</param>
Expand All @@ -51,7 +51,7 @@ public interface ILogger
void Error(Exception exception, string? message = null, [CallerMemberName] string? callerMemberName = null);

/// <summary>
/// 在单独的日志文件中记录一条导致致命性错误的异常,并同时在普通的日志文件中插入一段高亮显示的致命错误标记
/// 单独记录导致致命性错误的异常
/// 请注意,仅在全局区域记录此异常,全局区域如果还能收到异常说明方法内部有未处理的异常。
/// </summary>
/// <param name="exception">异常实例。</param>
Expand Down
10 changes: 9 additions & 1 deletion src/Utils/Walterlv.Logger/IO/TextFileLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ public TextFileLogger(FileInfo infoLogFile, FileInfo errorLogFile, string lineEn
_errorLogFile = areSameFile ? infoLogFile : errorLogFile;
}

/// <summary>
/// 获取或设置一个值,指示在记录错误日志时,是否同时在信息日志上对此错误进行高亮显示。
/// </summary>
public bool HighlightErrorsOnInfo { get; set; } = true;

/// <summary>
/// 请求在写入首条日志前针对日志文件执行一些代码。代码可能在任一线程中执行,但确保不会并发。
/// </summary>
Expand Down Expand Up @@ -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));
Expand Down
Loading