public bool FromString(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return(false);
            }

            var tokens = value.Split(TokenSeparator);

            if (tokens.Length != 6)
            {
                return(false);
            }

            int partId;

            if (!int.TryParse(tokens[0], out partId) || partId <= 0)
            {
                return(false);
            }
            PartId = partId;

            long position;

            if (!long.TryParse(tokens[1], out position) || position < 0)
            {
                return(false);
            }
            Position = position;

            long length;

            if (!long.TryParse(tokens[2], out length) || Length < 0)
            {
                return(false);
            }
            Length = length;

            bool isCompleted;

            if (!bool.TryParse(tokens[3], out isCompleted))
            {
                return(false);
            }
            IsCompleted = isCompleted;

            int partNum;

            if (!(int.TryParse(tokens[4], out partNum) && partNum > 0 && !string.IsNullOrEmpty(tokens[5])))
            {
                return(false);
            }

            PartETag = new PartETag(partNum, tokens[5]);

            return(true);
        }
        public bool FromString(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return false;
            }

            var tokens = value.Split(TokenSeparator);
            if (tokens.Length != 6)
            {
                return false;
            }

            int partId;
            if (!int.TryParse(tokens[0], out partId) || partId <= 0)
            {
                return false;
            }
            PartId = partId;

            long position;
            if (!long.TryParse(tokens[1], out position) || position < 0)
            {
                return false;
            }
            Position = position;

            long length;
            if (!long.TryParse(tokens[2], out length) || Length < 0)
            {
                return false;
            }
            Length = length;

            bool isCompleted;
            if (!bool.TryParse(tokens[3], out isCompleted))
            {
                return false;
            }
            IsCompleted = isCompleted;

            int partNum;
            if (int.TryParse(tokens[4], out partNum) && partNum > 0 && !string.IsNullOrEmpty(tokens[5]))
            {
                PartETag = new PartETag(partNum, tokens[5]);
            }

            return true;
        }