Add FilePathComparer (Unix, Windows, Native)

This commit is contained in:
Waldi Ravens 2019-05-08 09:00:03 +02:00
parent 09dcfa9007
commit 59de2aeecb
2 changed files with 70 additions and 0 deletions

69
libse/FilePathComparer.cs Normal file
View File

@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.IO;
namespace Nikse.SubtitleEdit.Core
{
public abstract class FilePathComparer : IEqualityComparer<string>, IComparer<string>
{
private sealed class WindowsFilePathComparer: FilePathComparer
{
public override int Compare(string path1, string path2)
{
return ReferenceEquals(path1, path2)
? 0
: ReferenceEquals(path2, null)
? 1
: ReferenceEquals(path1, null)
? -1
: string.Compare(path1.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), path2.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase);
}
public override bool Equals(string path1, string path2)
{
return ReferenceEquals(path1, path2) ||
(!(ReferenceEquals(path1, null) || ReferenceEquals(path2, null)) &&
string.Equals(path1.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), path2.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase));
}
public override int GetHashCode(string path)
{
return path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar).ToUpperInvariant().GetHashCode();
}
}
private sealed class UnixFilePathComparer : FilePathComparer
{
public override int Compare(string path1, string path2)
{
return ReferenceEquals(path1, path2)
? 0
: ReferenceEquals(path2, null)
? 1
: ReferenceEquals(path1, null)
? -1
: string.Compare(path1.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), path2.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), StringComparison.Ordinal);
}
public override bool Equals(string path1, string path2)
{
return ReferenceEquals(path1, path2) ||
(!(ReferenceEquals(path1, null) || ReferenceEquals(path2, null)) &&
string.Equals(path1.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), path2.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), StringComparison.Ordinal));
}
public override int GetHashCode(string path)
{
return path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar).GetHashCode();
}
}
public static FilePathComparer Native => Configuration.IsRunningOnWindows ? Windows : Unix;
public static FilePathComparer Windows => new WindowsFilePathComparer();
public static FilePathComparer Unix => new UnixFilePathComparer();
public abstract int Compare(string path1, string path2);
public abstract bool Equals(string path1, string path2);
public abstract int GetHashCode(string path);
}
}

View File

@ -144,6 +144,7 @@
<Compile Include="Enums\SubtitleSortCriteria.cs" />
<Compile Include="FastBitmap.cs" />
<Compile Include="FastFileStream.cs" />
<Compile Include="FilePathComparer.cs" />
<Compile Include="FileUtil.cs" />
<Compile Include="FixCasing.cs" />
<Compile Include="Forms\CheckForUpdatesHelper.cs" />