LocalDirectory ="E:\demo\test.txt"
ディレクトリではなく、ファイル名を付けました。
E:\demo\test.txt はファイル名です。
ここからのコードは次のとおりです
https://github.com/loresoft/msbuildtasks/blob/master/Source/MSBuild.Community.Tasks/Ftp/FtpUploadDirectoryContent.cs
            try
            {
                UploadDirectory( LocalDirectory, "*.*", Recursive );
            }
            catch(FtpException caught)
            {
                Log.LogErrorFromException( caught, false );
                Log.LogError( "Couldn't upload directory." );
                return false;
            }
       foreach(string file in Directory.GetFiles( localPath, mask ))
        {
            String filename = Path.GetFileName( file );
            Store( file, filename );
            Log.LogMessage( MessageImportance.Low, "{0} uploaded succesfully.", localPath );
        }
したがって、あなたがやろうとしていることは本質的に次のとおりです。
 Directory.GetFiles( "E:\demo\test.txt" , "*.* ))
これはうまくいきません。
次のように変更します。
LocalDirectory="E:\demo\"
上記の github リンクからのコード例。
/// <Target Name="DeployWebsite">
/// <FtpUploadDirectoryContent
/// ServerHost="ftp.myserver.com"
/// Port="42"
/// Username="user"
/// Password="p@ssw0rd"
/// LocalDirectory="c:\build\mywebsite"
/// RemoteDirectory="root\www\mywebsite"
/// Recursive="true"
/// />
注: LocalDirectory はファイル名を参照しません。
単一のファイルをアップロードする場合は、次の方法が考えられます。
https://www.assembla.com/spaces/GHFtpTask/wiki/Home/history
MSBuild の FtpTask の主な機能は次のとおりです。
**Upload, download or delete a single file on a FTP server** 
Recursively upload, download or delete a directory
Use multiple FTP connections simultaneously
MSBuild の FtpTask には .NET 2.0 が必要です。