public TraversedDirectoryEntry(DirectoryData directoryData, IList <FileName> childFileNames) { _directoryData = directoryData; _childFileNames = childFileNames; }
public DirectorySnapshot(DirectoryData directoryData, ReadOnlyCollection <DirectorySnapshot> childDirectories, ReadOnlyCollection <FileName> childFiles) { _directoryData = directoryData; _childDirectories = childDirectories; _childFiles = childFiles; }
private DirectorySnapshot ApplyDirectorySnapshotDelta( ProjectProcessingData data, DirectorySnapshot oldDirectory) { var oldDirectoryPath = oldDirectory.DirectoryName.RelativePath; // Create lists of created dirs and files. We havet to access the file system to know // if each path is a file or a directory. List <IFileInfoSnapshot> createDirs = null; List <IFileInfoSnapshot> createdFiles = null; foreach (var path in data.PathChanges.GetCreatedEntries(oldDirectoryPath).ToForeachEnum()) { var info = _fileSystem.GetFileInfoSnapshot(data.Project.RootPath.Combine(path)); if (info.IsDirectory) { if (createDirs == null) { createDirs = new List <IFileInfoSnapshot>(); } createDirs.Add(info); } else if (info.IsFile) { if (createdFiles == null) { createdFiles = new List <IFileInfoSnapshot>(); } createdFiles.Add(info); } } // Recursively create new directory entires for previous (non deleted) // entries. var childDirectories = oldDirectory.ChildDirectories .Where(dir => !data.PathChanges.IsDeleted(dir.DirectoryName.RelativePath)) .Select(dir => ApplyDirectorySnapshotDelta(data, dir)) .ToList(); // Add created directories if (createDirs != null) { foreach (var info in createDirs.ToForeachEnum()) { var name = data.FileSystemNameFactory.CreateDirectoryName(oldDirectory.DirectoryName, info.Path.FileName); var childSnapshot = CreateDirectorySnapshot(data, name, info.IsSymLink); // Note: File system change notifications are not always 100% // reliable. We may get a "create" event for directory we already know // about. var index = childDirectories.FindIndex(x => SystemPathComparer.Instance.StringComparer.Equals(x.DirectoryName.RelativePath.FileName, name.RelativePath.FileName)); if (index >= 0) { childDirectories.RemoveAt(index); } childDirectories.Add(childSnapshot); } // We need to re-sort the array since we added new entries childDirectories.Sort((x, y) => SystemPathComparer.Instance.StringComparer.Compare(x.DirectoryName.RelativePath.FileName, y.DirectoryName.RelativePath.FileName)); } // Match non deleted files // Sepcial case: if no file deleted or created, just re-use the list. IList <FileName> newFileList; if (data.PathChanges.GetDeletedEntries(oldDirectoryPath).Count == 0 && createdFiles == null) { newFileList = oldDirectory.ChildFiles; } else { // Copy the list of previous children, minus deleted files. var newFileListTemp = oldDirectory.ChildFiles .Where(x => !data.PathChanges.IsDeleted(x.RelativePath)) .ToList(); // Add created files if (createdFiles != null) { foreach (var info in createdFiles.ToForeachEnum()) { var name = data.FileSystemNameFactory.CreateFileName(oldDirectory.DirectoryName, info.Path.FileName); newFileListTemp.Add(name); } // We need to re-sort the array since we added new entries newFileListTemp.Sort((x, y) => SystemPathComparer.Instance.StringComparer.Compare(x.RelativePath.FileName, y.RelativePath.FileName)); // Note: File system change notifications are not always 100% // reliable. We may get a "create" event for files we already know // about. ArrayUtilities.RemoveDuplicates(newFileListTemp, (x, y) => SystemPathComparer.Instance.StringComparer.Equals(x.RelativePath.FileName, y.RelativePath.FileName)); } newFileList = newFileListTemp; } var newData = new DirectoryData(oldDirectory.DirectoryName, oldDirectory.IsSymLink); return(new DirectorySnapshot( newData, childDirectories.ToReadOnlyCollection(), newFileList.ToReadOnlyCollection())); }
public DirectorySnapshot(DirectoryData directoryData, ReadOnlyCollection<DirectorySnapshot> childDirectories, ReadOnlyCollection<FileName> childFiles) { _directoryData = directoryData; _childDirectories = childDirectories; _childFiles = childFiles; }