コード例 #1
0
        public long PrepareToWrite(long file_size, string file_hash)
        {
            long current_size = FileCommon.GetSize(_file_name);

            if (current_size >= file_size) //seems need not to transmit
            {
                return(-1);
            }
            if (current_size == 0) //create new file and new information record file
            {
                _file_stream             = new FileStream(_file_name, FileMode.OpenOrCreate, FileAccess.Write);
                _file_information_stream = new FileStream(_file_information_record, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                _file_information_writer = new StreamWriter(_file_information_stream);
                _file_information_writer.WriteLine(String.Format("{0} {1} {2}", file_hash, file_size, 0));
            }
            else if (current_size > 0 && current_size < file_size) //compare current file information to lastest record information
            {
                _file_information_stream = new FileStream(_file_information_record, FileMode.Open, FileAccess.ReadWrite);
                _file_information_writer = new StreamWriter(_file_information_stream);
                string[]     info_list;
                StreamReader info_reader = new StreamReader(_file_information_stream);
                info_list = info_reader.ReadLine().Split();

                if (info_list.Length != 3 || info_list[0] != file_hash || Convert.ToInt64(info_list[1]) != file_size)
                {
                    return(-1);
                }
                else
                {
                    _file_stream = new FileStream(_file_name, FileMode.Append, FileAccess.Write);
                    _file_information_stream.Seek(0, SeekOrigin.Begin);
                }
            }
            _sha256_str = file_hash;
            _total_size = file_size;
            _offset     = current_size;
            return(current_size);
        }
コード例 #2
0
        public static async Task <string> Resolve(string input_line)
        {
            string[] input_array = input_line.Split();
            string   command     = input_array[0];

            if (command == "retrieve")
            {
                if (input_array.Length == 3)
                {
                    return("store " + input_array[1] + " " + input_array[2]);
                }
                else
                {
                    return("error number of parameters in retrieve command.");
                }
            }
            else if (command == "store")
            {
                if (input_array.Length == 3 && File.Exists(input_array[1]))
                {
                    return("upload " + input_array[1] + " " + input_array[2]
                           + " " + FileCommon.GetSize(input_array[1]) + " " + FileCommon.ComputeHash(input_array[1]));
                }
                else
                {
                    return("error number of parameters in store command.");
                }
            }
            else if (command == "upload")
            {
                if (input_array.Length == 5 && Convert.ToInt64(input_array[3]) > 0)
                {
                    FileReceive fileReceive   = new FileReceive(input_array[2]);
                    long        seek_position = fileReceive.PrepareToWrite(Convert.ToInt64(input_array[3]), input_array[4]);
                    if (seek_position >= 0)
                    {
                        IPEndPoint localPoint = fileReceive.InitAndGetLocalEndPoint();
                        fileReceive.Run();
                        return("move " + input_array[1] + " " + input_array[2] + " "
                               + seek_position + " " + localPoint.Address + " " + localPoint.Port);
                    }
                    else
                    {
                        return("error file already exists");
                    }
                }
                else
                {
                    return("error file size");
                }
            }
            else if (command == "move")
            {
                FileSend.SendFile(input_array[1], Convert.ToInt64(input_array[3]),
                                  input_array[4], Convert.ToInt32(input_array[5]));
                return(null);
            }
            else if (command == "error")
            {
                return(null);
            }
            else
            {
                return("error invalid commandline");
            }
        }