public static void UploadFile(string localFileToUpload, string targetUrl, string userName, string password, bool keepAlive)
        {
            FtpState state = new FtpState();

            state.FileName = localFileToUpload;


            StartUploadUsingFtpState(targetUrl, userName, password, keepAlive, state);
        }
        private static void EndGetResponseCallback(IAsyncResult result)
        {
            FtpState       state    = (FtpState)result.AsyncState;
            FtpWebResponse response = null;

            response = (FtpWebResponse)state.Request.EndGetResponse(result);
            response.Close();
            state.StatusDescription = response.StatusDescription;

            state.OperationComplete.Set();
        }
        private static void EndGetStreamCallback(IAsyncResult result)
        {
            FtpState state = (FtpState)result.AsyncState;

            Stream requestStream = null;

            Stream uploadStream = null;

            try
            {
                requestStream = state.Request.EndGetRequestStream(result);
                const int bufferLength = 2048;
                byte[]    buffer       = new byte[bufferLength];
                int       count        = 0;
                int       readBytes    = 0;

                if (!string.IsNullOrEmpty(state.TextToUpload))
                {
                    byte[] byteArray = Encoding.ASCII.GetBytes(state.TextToUpload);
                    uploadStream = new MemoryStream(byteArray);
                }
                else
                {
                    uploadStream = File.OpenRead(state.FileName);
                }

                do
                {
                    readBytes = uploadStream.Read(buffer, 0, bufferLength);
                    requestStream.Write(buffer, 0, readBytes);
                    count += readBytes;
                }while (readBytes != 0);

                requestStream.Close();

                state.Request.BeginGetResponse(
                    new AsyncCallback(EndGetResponseCallback),
                    state
                    );
            }
            catch (WebException)
            {
                state.Request.Abort();
                state.OperationComplete.Set();
                state.OperationException = new Exception();
            }
            finally
            {
                if (uploadStream != null)
                {
                    uploadStream.Close();
                }
            }
        }
        private static void StartUploadUsingFtpState(string targetUrl, string userName, string password, bool keepAlive, FtpState state)
        {
            ManualResetEvent waitObject;

            FtpWebRequest request;

            bool fileUploaded = false;

            do
            {
                try
                {
                    fileUploaded = true;

                    request       = GetFtpWebRequest(targetUrl, userName, password, WebRequestMethods.Ftp.UploadFile, keepAlive);
                    waitObject    = state.OperationComplete;
                    state.Request = request;

                    request.BeginGetRequestStream(
                        new AsyncCallback(EndGetStreamCallback),
                        state
                        );
                    state.Request.GetResponse();
                    waitObject.WaitOne();
                }
                catch (WebException e)
                {
                    if (e.ToString().Contains("550"))
                    {
                        fileUploaded = false;
                        CreateDirectory(userName, password, ReturnBaseDirectory(targetUrl), 2);
                    }
                    else
                    {
                        throw e;
                    }
                }
            } while (!fileUploaded);
        }