private void InternalDownload(IChannelSession channel, Stream input, FileSystemInfo fileSystemInfo) { var modifiedTime = DateTime.Now; var accessedTime = DateTime.Now; var startDirectoryFullName = fileSystemInfo.FullName; var currentDirectoryFullName = startDirectoryFullName; var directoryCounter = 0; while (true) { var message = ReadString(input); if (message == "E") { SendConfirmation(channel); // Send reply directoryCounter--; currentDirectoryFullName = new DirectoryInfo(currentDirectoryFullName).Parent.FullName; if (directoryCounter == 0) { break; } continue; } var match = DirectoryInfoRe.Match(message); if (match.Success) { SendConfirmation(channel); // Send reply // Read directory var mode = long.Parse(match.Result("${mode}")); var filename = match.Result("${filename}"); DirectoryInfo newDirectoryInfo; if (directoryCounter > 0) { newDirectoryInfo = Directory.CreateDirectory(string.Format("{0}{1}{2}", currentDirectoryFullName, Path.DirectorySeparatorChar, filename)); newDirectoryInfo.LastAccessTime = accessedTime; newDirectoryInfo.LastWriteTime = modifiedTime; } else { // Dont create directory for first level newDirectoryInfo = fileSystemInfo as DirectoryInfo; } directoryCounter++; currentDirectoryFullName = newDirectoryInfo.FullName; continue; } match = FileInfoRe.Match(message); if (match.Success) { // Read file SendConfirmation(channel); // Send reply var mode = match.Result("${mode}"); var length = long.Parse(match.Result("${length}")); var fileName = match.Result("${filename}"); var fileInfo = fileSystemInfo as FileInfo; if (fileInfo == null) { fileInfo = new FileInfo(string.Format("{0}{1}{2}", currentDirectoryFullName, Path.DirectorySeparatorChar, fileName)); } using (var output = fileInfo.OpenWrite()) { InternalDownload(channel, input, output, fileName, length); } fileInfo.LastAccessTime = accessedTime; fileInfo.LastWriteTime = modifiedTime; if (directoryCounter == 0) { break; } continue; } match = TimestampRe.Match(message); if (match.Success) { // Read timestamp SendConfirmation(channel); // Send reply var mtime = long.Parse(match.Result("${mtime}")); var atime = long.Parse(match.Result("${atime}")); var zeroTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); modifiedTime = zeroTime.AddSeconds(mtime); accessedTime = zeroTime.AddSeconds(atime); continue; } SendConfirmation(channel, 1, string.Format("\"{0}\" is not valid protocol message.", message)); } }
private async void InternalDownload(IChannelSession channel, Stream input, IStorageItem fileSystemInfo) { var modifiedTime = DateTime.Now; var accessedTime = DateTime.Now; var startDirectoryFullName = fileSystemInfo.Path; var currentDirectoryFullName = startDirectoryFullName; var directoryCounter = 0; while (true) { var message = ReadString(input); if (message == "E") { SendConfirmation(channel); // Send reply directoryCounter--; currentDirectoryFullName = Path.GetDirectoryName(currentDirectoryFullName); if (directoryCounter == 0) { break; } continue; } var match = DirectoryInfoRe.Match(message); if (match.Success) { SendConfirmation(channel); // Send reply // Read directory var mode = long.Parse(match.Result("${mode}")); var filename = match.Result("${filename}"); IStorageFolder newDirectoryInfo; if (directoryCounter > 0) { newDirectoryInfo = await(await StorageFolder.GetFolderFromPathAsync(currentDirectoryFullName)).CreateFolderAsync(filename); } else { // Dont create directory for first level newDirectoryInfo = fileSystemInfo as IStorageFolder; } directoryCounter++; currentDirectoryFullName = newDirectoryInfo.Path; continue; } match = FileInfoRe.Match(message); if (match.Success) { // Read file SendConfirmation(channel); // Send reply var mode = match.Result("${mode}"); var length = long.Parse(match.Result("${length}")); var fileName = match.Result("${filename}"); var fileInfo = fileSystemInfo as IStorageFile; if (fileInfo == null) { fileInfo = await StorageFile.GetFileFromPathAsync(Path.Combine(currentDirectoryFullName, fileName)); } using (var output = await fileInfo.OpenStreamForWriteAsync()) { InternalDownload(channel, input, output, fileName, length); } if (directoryCounter == 0) { break; } continue; } match = TimestampRe.Match(message); if (match.Success) { // Read timestamp SendConfirmation(channel); // Send reply var mtime = long.Parse(match.Result("${mtime}")); var atime = long.Parse(match.Result("${atime}")); var zeroTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); modifiedTime = zeroTime.AddSeconds(mtime); accessedTime = zeroTime.AddSeconds(atime); continue; } SendConfirmation(channel, 1, string.Format("\"{0}\" is not valid protocol message.", message)); } }