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