/// <summary> /// DELETES A FILE FROM THE REMOTE STORAGE SERVERS /// </summary> /// <param name="folder">FOLDER WHERE THE FILE IS LOCATED</param> /// <param name="fileName">FILENAME OF THE FILE TO DELETE</param> /// <returns>TRUE FOR A SUCCESSFUL DOWNLOAD OTHERWISE WILL THROW AN EXCEPTION</returns> public bool DeleteFile(string folder, string fileName) { //LOOP THROUGH THE HANDLERS AND TRY TO DELETE IT FROM ONE WHICH WILL PROPOGATE TO THE REST foreach (string tmpHandler in RemoteServiceHandlers.Shuffle()) { //SET THE URL tmpService.Url = tmpHandler; //CALL THE DELETE FILE FUNCTION ON THE REMOTE SERVER return(tmpService.DeleteFile(folder, fileName)); } //SOMETHING FAILED SO RETURN FALSE return(false); }
/// <summary> /// UPLOADS A FILE TO A REMOTE STORAGE LOCATION /// </summary> /// <param name="stream">STREAM TO PULL DATA FROM</param> /// <param name="folder">DESTINATION FOLDER TO STORE REMOTE FILE</param> /// <param name="fileName">FILENAME OF THE REMOTE FILE</param> /// <param name="overWrite">DETERMINES IF THE FILE SHOULD BE OVERWRITTEN SHOULD IT EXIST</param> /// <param name="replicationCount">NUMBER OF TIMES TO REPLICATE THE FILE</param> /// <param name="extraInfo">ANY ADDITION INFORMATION TO BE STORED ABOUT THIS FILE</param> /// <returns>RETURNS TRUE WHEN THE FILE IS UPLOADED AND FALSE IF IT FAILS</returns> public bool UploadFile(Stream stream, string folder, string fileName, bool overWrite, int replicationCount, ExtraInfo[] extraInfo) { byte[] buffer = new byte[mDefaultBufferSize]; int count = 0; //LOOP THROUGH ALL OF THE CONTROLLER UNITS ATTEMPTING TO UPLOAD THIS FILE UNTIL WE SUCCEED foreach (string tmpHandler in RemoteServiceHandlers.Shuffle()) { //SET THE CONTROLLER = TO THE CURRENT ONE FROM OUR LIST tmpService.Url = tmpHandler; try { //THIS WILL CAUSE A CONTROLLER TO CREATE A TEMP FILE TO BEGIN HOLDING UPLOADED CHUNKS string tmpFileID = tmpService.BeginPutFileChunk(folder, fileName, replicationCount, overWrite, extraInfo); //IF THE STREAM CAN SEEK THEN RETURN BACK TO 0 if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } //WHILE WE ARE STILL READING DATA FROM THE STREAM KEEP UPLOADING IT while ((count = stream.Read(buffer, 0, buffer.Length)) != 0) { tmpService.PutFileChunk(tmpFileID, buffer.Take(count).ToArray()); } //THIS WILL FORCE THE CONTROLLER TO DISTRIBUTE THE FILE TO THE REMOTE STORAGE LOCATIONS return(tmpService.EndPutFileChunk(tmpFileID)); } catch { //CATCH EXCEPTIONS AND MOVE ON TO TRY A DIFFERENT REMOTE STORAGE } } //IF WE HAVE MADE IT THIS FAR THEN THE FILE DID NOT UPLOAD CORRECTLY SO WE FAILED return(false); }
/// <summary> /// DOWNLOADS A FILE FROM A REMOTE STORAGE LOCATION /// </summary> /// <param name="folder">FOLDER WHERE THE REMOTE FILE IS STORED</param> /// <param name="fileName">NAME OF THE REMOTE FILE TO RETRIEVE</param> /// <param name="buffer">BUFFER WHERE FILE DATA IS TO BE STORED</param> /// <returns>RETURN TRUE IF THE FILE DOWNLOAD SUCCEEDED OR FALSE IF IT FAILS</returns> public bool DownloadFile(string folder, string fileName, Stream stream) { //LOOP THROUGH ALL POSSIBLE CONTROLLERS IN ORDER TO DOWNLOAD THE FILE foreach (string tmpHandler in RemoteServiceHandlers.Shuffle()) { tmpService.Url = tmpHandler; try { //INITIATE THE DOWNLOAD OF THE FILE TO THE SELECTED CONTROLLER string fileID = tmpService.BeginGetFileChunk(folder, fileName); if (fileName != null) { byte[] tmpBuffer; //WHILE DATA IS COMING BACK KEEP READING THE FILE while ((tmpBuffer = tmpService.GetFileChunk(fileID, mDefaultBufferSize)) != null) { //APPEND THE DATA RECEIVED ONTO THE STREAM PASSED IN stream.Write(tmpBuffer, 0, tmpBuffer.Length); } //CALL THE END FUNCTION SO THE SERVER WILL CLEAN ITSELF UP tmpService.EndGetFileChunk(fileID); //RETURN TRUE SO THE USER KNOWS THE FILE DOWNLOADED return(true); } } catch { //CATCH EXCEPTIONS AND MOVE ON TO TRY A DIFFERENT REMOTE STORAGE } } //IF WE MADE IT THIS FAR THEN THE FILE DID NOT DOWNLOAD return(false); }