예제 #1
0
        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));
            }
        }
예제 #2
0
        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));
            }
        }