-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileUtility.cs
More file actions
74 lines (67 loc) · 3.06 KB
/
FileUtility.cs
File metadata and controls
74 lines (67 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BuildTask
{
public class FileUtility
{
// remove "folder/.." pattern
// remove "." pattern
private static string[] SplitAndDustPath(string _path)
{
var splits = _path.Split(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
splits = splits.Where(s => s != ".").ToArray();
while (true)
{
var ix = splits.Select((s, i) => new { str = s, idx = i }).Where(o => o.idx != 0 && o.str == "..").Select(o => o.idx).FirstOrDefault();
if (ix == 0)
break;
splits = splits.Where((s, i) => i != ix - 1 && i != ix).ToArray();
}
return splits;
}
public static string MakeRelative(string _referencePath, string _path)
{
var ref_splits = SplitAndDustPath(_referencePath);
var path_splits = SplitAndDustPath(_path);
int count = 0;
int n = Math.Min(ref_splits.Count(), path_splits.Count());
for (int i = 0; i < n; ++i)
{
if (string.Compare(ref_splits[i], path_splits[i], true)!=0)
break;
++count;
}
return ref_splits.Skip(count).Select(x => "..").Concat(path_splits.Skip(count)).DefaultIfEmpty("").Aggregate((s1, s2) => s1 + Path.DirectorySeparatorChar + s2);
}
//Assert.AreEqual(FileUtility.MakeRelative(@"A\B/C", @"A/B\C"), "");
//Assert.AreEqual(FileUtility.MakeRelative(@"A\B/../C", @"A\C\E"), "E");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C/D/E", "A/B/X/Y"), @"..\..\..\X\Y");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C", "A/B/C/Z"), @"Z");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C/Z", "A/B/C"), @"..");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C/Z", "A/B/C/"), @"..");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C/Z/", "A/B/C/"), @"..");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C/Z/", "A/B/C"), @"..");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C", "."), @"..\..\..");
//Assert.AreEqual(FileUtility.MakeRelative(".", "A/B/C" ), @"A\B\C");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C/Z", "A/B/C.exe"), @"..\..\C.exe");
//Assert.AreEqual(FileUtility.MakeRelative("", "A/B/C"), @"A\B\C");
//Assert.AreEqual(FileUtility.MakeRelative("A/B/C", ""), @"..\..\..");
}
public class ScopedWorkingDirectory : IDisposable
{
private string storedWorkingFolder;
public ScopedWorkingDirectory(string _newWorkingDirectory)
{
storedWorkingFolder = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(_newWorkingDirectory);
}
public void Dispose()
{
Directory.SetCurrentDirectory(storedWorkingFolder);
}
}
}