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); }
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"); } }