Recently I changed a working Ftp.BeginPutFile
call where I pass the local file name as a string
, to a call of another overload of Ftp.BeginPutFile
that gets a Stream
object instead of the file name.
The reason is that I have to support paths that are longer than 260 characters for which your library (since it is based on the standard .NET functions) fails.
Instead, I am using my self-developed Long Path Library and create a FileStream
object with that library and pass it to the Ftp.BeginPutFile
overload.
When doing this, the upload often (but not always) fails with an InvalidOperationException
:
Local item doesn't exist.
On the call stack:
at Rebex.IO.LocalItem.1z5Wy2Z()
at Rebex.IO.LocalItem.get_Length()
at 1RyBHn.27NpLhZ.zY1W4Z(TransferAction , String , String , Char[] )
at 1RyBHn.27NpLhZ.zY1W4Z(TransferAction , String , Stream , Char[] )
at Rebex.Net.Ftp.17h3LnZ(TransferAction , String , Stream )
at Rebex.Net.Ftp.BeginPutFile(Stream
sourceStream, String remotePath,
AsyncCallback callback, Object state)
bei ZetaProducerPublishing.Runtime.Protocols.FtpProtocol...
Actually the file being opened does exist.
My question is:
How to correctly use your library with a file stream instead of a file name?
Update 1, some more details:
My old code was:
...
var ar1 =
_ftp.BeginPutFile(
information1.LocalFilePath,
information1.RemoteFolderPath.TrimEnd('/') + '/' +
ZlpPathHelper.GetFileNameFromFilePath(information1.LocalFilePath),
delegate {},
null);
...
My new code is:
...
using (var sourceStream = new System.IO.FileStream(
ZlpIOHelper.CreateFileHandle(
information1.LocalFilePath,
CreationDisposition.OpenExisting,
FileAccess.GenericRead,
FileShare.Read),
System.IO.FileAccess.Read))
{
var ar1 =
_ftp.BeginPutFile(
sourceStream,
information1.RemoteFolderPath.TrimEnd('/') + '/' +
ZlpPathHelper.GetFileNameFromFilePath(information1.LocalFilePath),
delegate {},
null);
...
The exception is thrown inside the BeginPutFile
call.
Since I am using my long path library extensively in a lot of projects, I am assuming that it is working reliable. I can imagine that there is a special condition inside Rebex that I do not cover or an issue inside Rebex with streams.