You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
7.3 KiB
C#

namespace BP
{
using System;
using System.Collections;
using System.IO;
public class FtpConnection : IDisposable
{
private IntPtr hConnect;
private IntPtr hInternet;
public FtpConnection()
{
this.hInternet = Open();
}
public FtpConnection(string serverOrIp) : this(serverOrIp, 0x15, null, null)
{
}
public FtpConnection(string serverOrIp, int serverPort, string userName, string password)
{
IntPtr hInt = Open();
this.hConnect = InternalConnect(hInt, serverOrIp, serverPort, userName, password);
this.hInternet = hInt;
}
public void Close()
{
((IDisposable) this).Dispose();
}
public void Connect(string serverOrIp)
{
this.Connect(serverOrIp, 0x15, null, null);
}
public void Connect(string serverOrIp, int serverPort, string userName, string password)
{
SafeCloseHandle(ref this.hConnect);
this.hConnect = InternalConnect(this.hInternet, serverOrIp, serverPort, userName, password);
}
public void CreateDirectory(string CreateDir)
{
bool flag = false;
try
{
FtpException.THROWONFALSE(NativeMethods.FtpCreateDirectory(this.hConnect, CreateDir));
}
catch
{
flag = false;
}
}
public void DeleteFile(string fileName)
{
FtpException.THROWONFALSE(NativeMethods.FtpDeleteFile(this.hConnect, fileName));
}
public bool DirectoryExist(string directory)
{
bool rc = false;
try
{
rc = NativeMethods.FtpSetCurrentDirectory(this.hConnect, directory);
FtpException.THROWONFALSE(rc);
NativeMethods.FtpSetCurrentDirectory(this.hConnect, "..");
}
catch (Exception)
{
rc = false;
}
return rc;
}
public bool FileExist(string fileName)
{
try
{
int length = this.FindFiles(fileName).Length;
return (length > 0);
}
catch
{
return false;
}
}
~FtpConnection()
{
((IDisposable) this).Dispose();
}
public Win32FindData[] FindFiles() =>
this.FindFiles(null);
public Win32FindData[] FindFiles(string filter)
{
Win32FindData[] dataArray;
BP.Win32FindData data;
IntPtr handle = NativeMethods.FtpFindFirstFile(this.hConnect, filter, out data, 0, IntPtr.Zero);
FtpException.THROWONNULL(handle);
try
{
ArrayList list = new ArrayList();
do
{
list.Add(data);
}
while (NativeMethods.InternetFindNextFile(handle, out data));
dataArray = (Win32FindData[]) list.ToArray(typeof(Win32FindData));
}
finally
{
NativeMethods.InternetCloseHandle(handle);
}
return dataArray;
}
public string GetCurrentDirectory()
{
string str;
FtpException.THROWONFALSE(NativeMethods.FtpGetCurrentDirectory(this.hConnect, out str));
return str;
}
public void GetFile(string remoteFile, string localFile, bool failIfExists, FileAttributes attributes)
{
this.GetFile(remoteFile, localFile, failIfExists, attributes, FtpTransferType.Binary);
}
public void GetFile(string remoteFile, string localFile, bool failIfExists, FileAttributes attributes, FtpTransferType transfer)
{
FtpException.THROWONFALSE(NativeMethods.FtpGetFile(this.hConnect, remoteFile, localFile, failIfExists, attributes, transfer, IntPtr.Zero));
}
private static IntPtr InternalConnect(IntPtr hInt, string serverOrIp, int serverPort, string userName, string password)
{
IntPtr handle = NativeMethods.InternetConnect(hInt, serverOrIp, serverPort, userName, password, InternetService.Ftp, 0, IntPtr.Zero);
FtpException.THROWONNULL(handle);
return handle;
}
private static IntPtr Open()
{
IntPtr handle = NativeMethods.InternetOpen("FtpConnection", InternetOpenType.Direct, null, null, 0);
FtpException.THROWONNULL(handle);
return handle;
}
public FtpStream OpenFile(string fileName, GenericRights rights) =>
this.OpenFile(fileName, rights, FtpTransferType.Binary);
public FtpStream OpenFile(string fileName, GenericRights rights, FtpTransferType flags)
{
IntPtr handle = NativeMethods.FtpOpenFile(this.hConnect, fileName, rights, flags, IntPtr.Zero);
FtpException.THROWONNULL(handle);
return new FtpStream(handle, rights);
}
public void PutFile(string localFile, string newRemoteFile)
{
this.PutFile(localFile, newRemoteFile, FtpTransferType.Binary);
}
public void PutFile(string localFile, string newRemoteFile, FtpTransferType transfer)
{
FtpException.THROWONFALSE(NativeMethods.FtpPutFile(this.hConnect, localFile, newRemoteFile, transfer, IntPtr.Zero));
}
public void PutStream(Stream stream, string newRemoteFile)
{
this.PutStream(stream, newRemoteFile, FtpTransferType.Binary);
}
public void PutStream(Stream stream, string newRemoteFile, FtpTransferType transfer)
{
long position = 0L;
if (stream.CanSeek)
{
position = stream.Position;
}
using (FtpStream stream2 = this.OpenFile(newRemoteFile, GenericRights.Write, transfer))
{
byte[] buffer = new byte[0x400];
for (int i = stream.Read(buffer, 0, buffer.Length); i > 0; i = stream.Read(buffer, 0, buffer.Length))
{
stream2.Write(buffer, 0, i);
}
}
if (stream.CanSeek)
{
stream.Position = position;
}
}
public void RemoveDirectory(string directory)
{
FtpException.THROWONFALSE(NativeMethods.FtpRemoveDirectory(this.hConnect, directory));
}
public void RenameFile(string existing, string newName)
{
FtpException.THROWONFALSE(NativeMethods.FtpRenameFile(this.hConnect, existing, newName));
}
internal static void SafeCloseHandle(ref IntPtr handle)
{
if (handle != IntPtr.Zero)
{
NativeMethods.InternetCloseHandle(handle);
handle = IntPtr.Zero;
}
}
public void SetCurrentDirectory(string directory)
{
FtpException.THROWONFALSE(NativeMethods.FtpSetCurrentDirectory(this.hConnect, directory));
}
void IDisposable.Dispose()
{
SafeCloseHandle(ref this.hConnect);
SafeCloseHandle(ref this.hInternet);
GC.SuppressFinalize(this);
}
}
}