220 lines
5.5 KiB
C#
220 lines
5.5 KiB
C#
|
using System;
|
||
|
using Tamir.SharpSsh.jsch;
|
||
|
using System.Collections;
|
||
|
|
||
|
/*
|
||
|
* Sftp.cs
|
||
|
*
|
||
|
* Copyright (c) 2006 Tamir Gal, http://www.tamirgal.com, All rights reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
*
|
||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||
|
* this list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in
|
||
|
* the documentation and/or other materials provided with the distribution.
|
||
|
*
|
||
|
* 3. The names of the authors may not be used to endorse or promote products
|
||
|
* derived from this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||
|
* *OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
**/
|
||
|
|
||
|
namespace Tamir.SharpSsh
|
||
|
{
|
||
|
public class Sftp : SshTransferProtocolBase
|
||
|
{
|
||
|
private MyProgressMonitor m_monitor;
|
||
|
private bool cancelled = false;
|
||
|
|
||
|
public Sftp(string sftpHost, string user, string password)
|
||
|
: base(sftpHost, user, password)
|
||
|
{
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
public Sftp(string sftpHost, string user)
|
||
|
: base(sftpHost, user)
|
||
|
{
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
private void Init()
|
||
|
{
|
||
|
m_monitor = new MyProgressMonitor(this);
|
||
|
}
|
||
|
|
||
|
protected override string ChannelType
|
||
|
{
|
||
|
get { return "sftp"; }
|
||
|
}
|
||
|
|
||
|
private ChannelSftp SftpChannel
|
||
|
{
|
||
|
get { return (ChannelSftp)m_channel; }
|
||
|
}
|
||
|
|
||
|
public override void Cancel()
|
||
|
{
|
||
|
cancelled = true;
|
||
|
}
|
||
|
|
||
|
//Get
|
||
|
|
||
|
public void Get(string fromFilePath)
|
||
|
{
|
||
|
Get(fromFilePath, ".");
|
||
|
}
|
||
|
|
||
|
public void Get(string[] fromFilePaths)
|
||
|
{
|
||
|
for (int i = 0; i < fromFilePaths.Length; i++)
|
||
|
{
|
||
|
Get(fromFilePaths[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Get(string[] fromFilePaths, string toDirPath)
|
||
|
{
|
||
|
for (int i = 0; i < fromFilePaths.Length; i++)
|
||
|
{
|
||
|
Get(fromFilePaths[i], toDirPath);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void Get(string fromFilePath, string toFilePath)
|
||
|
{
|
||
|
cancelled=false;
|
||
|
SftpChannel.get(fromFilePath, toFilePath, m_monitor, ChannelSftp.OVERWRITE);
|
||
|
}
|
||
|
|
||
|
//Put
|
||
|
|
||
|
public void Put(string fromFilePath)
|
||
|
{
|
||
|
Put(fromFilePath, ".");
|
||
|
}
|
||
|
|
||
|
public void Put(string[] fromFilePaths)
|
||
|
{
|
||
|
for (int i = 0; i < fromFilePaths.Length; i++)
|
||
|
{
|
||
|
Put(fromFilePaths[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Put(string[] fromFilePaths, string toDirPath)
|
||
|
{
|
||
|
for (int i = 0; i < fromFilePaths.Length; i++)
|
||
|
{
|
||
|
Put(fromFilePaths[i], toDirPath);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void Put(string fromFilePath, string toFilePath)
|
||
|
{
|
||
|
cancelled=false;
|
||
|
SftpChannel.put(fromFilePath, toFilePath, m_monitor, ChannelSftp.OVERWRITE);
|
||
|
}
|
||
|
|
||
|
//MkDir
|
||
|
|
||
|
public override void Mkdir(string directory)
|
||
|
{
|
||
|
SftpChannel.mkdir(directory);
|
||
|
}
|
||
|
|
||
|
//Ls
|
||
|
|
||
|
public ArrayList GetFileList(string path)
|
||
|
{
|
||
|
ArrayList list = new ArrayList();
|
||
|
foreach(Tamir.SharpSsh.jsch.ChannelSftp.LsEntry entry in SftpChannel.ls(path))
|
||
|
{
|
||
|
list.Add(entry.getFilename().ToString());
|
||
|
}
|
||
|
return list;
|
||
|
}
|
||
|
|
||
|
#region ProgressMonitor Implementation
|
||
|
|
||
|
private class MyProgressMonitor : SftpProgressMonitor
|
||
|
{
|
||
|
private long transferred = 0;
|
||
|
private long total = 0;
|
||
|
private int elapsed = -1;
|
||
|
private Sftp m_sftp;
|
||
|
private string src;
|
||
|
private string dest;
|
||
|
|
||
|
System.Timers.Timer timer;
|
||
|
|
||
|
public MyProgressMonitor(Sftp sftp)
|
||
|
{
|
||
|
m_sftp = sftp;
|
||
|
}
|
||
|
|
||
|
public override void init(int op, String src, String dest, long max)
|
||
|
{
|
||
|
this.src=src;
|
||
|
this.dest=dest;
|
||
|
this.elapsed = 0;
|
||
|
this.total = max;
|
||
|
timer = new System.Timers.Timer(1000);
|
||
|
timer.Start();
|
||
|
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
|
||
|
|
||
|
string note;
|
||
|
if (op.Equals(GET))
|
||
|
{
|
||
|
note = "Downloading " + System.IO.Path.GetFileName( src ) + "...";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
note = "Uploading " + System.IO.Path.GetFileName( src ) + "...";
|
||
|
}
|
||
|
m_sftp.SendStartMessage(src, dest, (int)total, note);
|
||
|
}
|
||
|
public override bool count(long c)
|
||
|
{
|
||
|
this.transferred += c;
|
||
|
string note = ("Transfering... [Elapsed time: " + elapsed + "]");
|
||
|
m_sftp.SendProgressMessage(src, dest, (int)transferred, (int)total, note);
|
||
|
return !m_sftp.cancelled;
|
||
|
}
|
||
|
public override void end()
|
||
|
{
|
||
|
timer.Stop();
|
||
|
timer.Dispose();
|
||
|
string note = ("Done in " + elapsed + " seconds!");
|
||
|
m_sftp.SendEndMessage(src, dest, (int)transferred, (int)total, note);
|
||
|
transferred = 0;
|
||
|
total = 0;
|
||
|
elapsed = -1;
|
||
|
src=null;
|
||
|
dest=null;
|
||
|
}
|
||
|
|
||
|
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
||
|
{
|
||
|
this.elapsed++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion ProgressMonitor Implementation
|
||
|
}
|
||
|
}
|