internal static FilesystemEntry TryFindFilesystemEntryInDirectory(DirectoryEntryBase parentDirectory, string childName)
        {
            if (parentDirectory == null)
            {
                throw new ArgumentNullException(nameof(parentDirectory));
            }

            if (String.IsNullOrEmpty(childName))
            {
                throw new ArgumentException();
            }

            return(parentDirectory
                   .EnumerateChildFilesystemEntries()
                   .FirstOrDefault(entry => FilesystemEntryNamesEquals(entry.Name, childName)));
        }
        /// <summary>
        /// Finds filesystem entry representing given path. If no such entry exists, returns null.
        /// </summary>
        internal static FilesystemEntry TryFindFilesystemEntry(string path, DirectoryEntryBase rootDirectory)
        {
            var           pathNames        = SplitPath(path);
            var           currentDirectory = rootDirectory;
            FileEntryBase file             = null;

            foreach (var pathName in pathNames)
            {
                if (currentDirectory == null)
                {
                    return(null);
                }

                if (file != null)
                {
                    //File cannot contain children
                    return(null);
                }

                var childEntry = TryFindFilesystemEntryInDirectory(currentDirectory, pathName);

                if (childEntry is DirectoryEntryBase childDirectory)
                {
                    currentDirectory = childDirectory;
                }
                else if (childEntry is FileEntryBase f)
                {
                    file = f;
                }
                else
                {
                    return(null);
                }
            }

            if (file != null)
            {
                return(file);
            }
            else
            {
                return(currentDirectory);
            }
        }