public string GetPathRelativeTo(string basePath) { var dir = new DirectoryInfo(basePath); var baseFs = new FolderStack(dir); var fileFs = new FolderStack(new FileInfo(FullPath).Directory); var kickedStack = new Stack<DirectoryInfo>(); string temp = string.Empty; while (baseFs.CurrentDirectory.FullName != fileFs.CurrentDirectory.FullName) { if (baseFs.CurrentDirectory.FullName.Length > fileFs.CurrentDirectory.FullName.Length) { baseFs.Pop(); temp += "../"; } else kickedStack.Push(fileFs.Pop()); } while (kickedStack.Any()) { temp += kickedStack.Pop().Name + "/"; } temp += new FileInfo(FullPath).Name; return temp; }
public void ResolveRefs() { var fs = new FolderStack(new FileInfo(FullPath).Directory); var unresolved = JsRefs.Where(jr => !jr.Resolve(ref fs)).ToList(); foreach (var jr in unresolved) { Console.WriteLine(string.Format("Could not resolve reference: {0} in file: {1}", jr.RefPath, new FileInfo(FullPath).Name)); } }
public bool Resolve(ref FolderStack fs) { fs = fs.Save(); try { var tempfs = fs; var filename = RefPath; if (RefPath.Contains("\\")) { var tokens = RefPath.Split('\\'); var dirs = tokens.Take(tokens.Length - 1); filename = tokens.Last(); dirs.TakeWhile(dir => ProcessDirectory(tempfs, dir)).ToList(); } ResolvedPath = Path.Combine(tempfs.CurrentDirectory.FullName, filename); Exists = File.Exists(ResolvedPath); return Exists; } finally { fs = fs.Restore(); } }
private bool ProcessDirectory(FolderStack fs, string curDir) { if (curDir == "..") return fs.Pop() != null; return fs.Push(curDir); }