public class DirectoryFileSplitter { private readonly string validatedFullPath; private int length; private int rootLength; public DirectoryFileSplitter(string validatedFullPath) { this.validatedFullPath = validatedFullPath; } public void Split(out string directory, out string file) { directory = null; file = null; if (validatedFullPath != null) { length = validatedFullPath.Length; rootLength = GetRootLength(validatedFullPath); IgnoreTrailingSlash(); // find the pivot index between end of string and root for (int pivot = length - 1; pivot >= rootLength; pivot--) { if (IsDirectorySeparator(validatedFullPath[pivot])) { directory = validatedFullPath.Substring(0, pivot); file = validatedFullPath.Substring(pivot + 1, length - pivot - 1); return; } } // no pivot, return just the trimmed directory directory = validatedFullPath.Substring(0, length); } return; } private void IgnoreTrailingSlash() { if (length > rootLength && EndsInDirectorySeparator(validatedFullPath)) length--; } }