Hello,
zero of transmitted bytes (return value of PutFile) is not an indicator of unsuccessful transfer. If a transfer is unsuccessful the exception is thrown. According to both the exception Status and/or the Message properties you can detect the error reason.
When no exception occurs then the transfer is successful and the return value indicates the number of bytes transmitted.
Following code can show you what it really happens.
try
{
long bytesTransmitted = ftp.PutFile(file);
Console.WriteLine("Transmitted {0} bytes.", bytesTransmitted);
}
catch(exception ex)
{
Console.WriteLine("Transfer error. Stack trace:\n{0}\n", ex.ToString());
}