private IEnumerable<SourceAndDestination> GetRemoteFiles(IEnumerable<string> sources, string destination, bool destinationIsFile = false) { foreach (string source in sources) { // TODO: TEST WHEN THE ROOT DIRECTORY IS SELECTED string lastPart = source.Substring(source.LastIndexOf(Constants.PATH_SEPARATOR) + 1, source.Length - source.LastIndexOf(Constants.PATH_SEPARATOR) - 1); if (_iDeviceInterface.IsFile(source)) { string newDestination = destination; string filename = lastPart; if (destinationIsFile) { newDestination = Path.GetDirectoryName(destination); filename = Path.GetFileName(destination); } SourceAndDestination lar = new SourceAndDestination(source, newDestination, FixFilename(filename), _iDeviceInterface.FileSize(source)); yield return lar; } else if (_iDeviceInterface.IsDirectory(source)) { foreach (string file in _iDeviceInterface.GetFiles(source)) { // copy all files over recursively IEnumerable<SourceAndDestination> files = GetRemoteFiles(new string[] { Utilities.PathCombine(source, file) }, Path.Combine(destination, lastPart)); foreach (SourceAndDestination f in files) { yield return f; } } foreach (string directory in _iDeviceInterface.GetDirectories(source)) { // copy all directories over recursively IEnumerable<SourceAndDestination> filesFromDirectories = GetRemoteFiles(new string[] { Utilities.PathCombine(source, directory) }, Path.Combine(destination, lastPart)); foreach (SourceAndDestination file in filesFromDirectories) { yield return file; } } } } }
private IEnumerable<SourceAndDestination> GetLocalFiles(IEnumerable<string> sources, string destination) { foreach (string source in sources) { if (File.Exists(source)) { string filename = Path.GetFileName(source); FileInfo fi = new FileInfo(source); SourceAndDestination lar = new SourceAndDestination(source, destination, UnfixFilename(filename), (ulong)fi.Length); yield return lar; } else if (Directory.Exists(source)) { DirectoryInfo directoryInfo = new DirectoryInfo(source); string directoryName = directoryInfo.Name; IEnumerable<SourceAndDestination> files = GetLocalFiles(Directory.GetFiles(source), Path.Combine(destination, directoryName)); foreach (SourceAndDestination f in files) { yield return f; } // copy all directories over recursively IEnumerable<SourceAndDestination> filesFromDirectories = GetLocalFiles(Directory.GetDirectories(source), Utilities.PathCombine(destination, directoryName)); foreach (SourceAndDestination file in filesFromDirectories) { yield return file; } } } }