using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tamir.SharpSsh;
using Tamir.SharpSsh.jsch;
using System.Collections;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO;
using System.Threading;
using System.Data;
namespace sftpTest
{
public class SFTPHelper
{
private Session m_session;
private Channel m_channel;
private ChannelSftp m_sftp;
private string user;
private string ip;
private int port;
private string pwd;
private string defRemotePath = "/xxx/xxx/";
public bool nameSame;
public bool mkdirSuccess;
public bool mksubdirSuccess;
public int fileLength;
private MySqlTransaction myTrans;
private MySqlCommand mycom;
private DataSet dsShot = new DataSet();
public List<string> msgList = new List<string>();
MySQL mySql = new MySQL();
JSch jsch = new JSch(); //利用java实现的通讯包
public SFTPHelper()
{
user = "xxx";
ip = "xxx.xxx.x.xxx";
port = 22;
pwd = "xxxxxx";
}
//host:sftp地址 user:用户名 pwd:密码
public SFTPHelper(string host, string user, string pwd)
{
string[] arr = host.Split(':');
string ip = arr[0];
int port = 22;
if (arr.Length > 1) port = Int32.Parse(arr[1]);
}
//SFTP连接状态
public bool Connected { get { return m_session.isConnected(); } }
//连接SFTP
public bool ConnectSftp()
{
try
{
m_session = jsch.getSession(user, ip, port);
m_session.setHost(ip);
MyUserInfo ui = new MyUserInfo();
ui.setPassword(pwd);
m_session.setUserInfo(ui);
if (!Connected)
{
m_session.connect();
m_channel = m_session.openChannel("sftp");
m_channel.connect();
m_sftp = (ChannelSftp)m_channel;
}
return true;
}
catch
{
return false;
}
}
//断开SFTP
public void DisconnectSftp()
{
if (Connected)
{
m_channel.disconnect();
m_session.disconnect();
}
}
public bool JudgeDirExit(string proName,string dirName)
{
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(defRemotePath + proName);
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry fileName in vvv)
{
string name = fileName.getFilename();
if (name == dirName)
{
return true;
}
}
return false;
}
public void Mkdir(string dirName)
{
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(defRemotePath.Remove(defRemotePath.LastIndexOf("/")));
nameSame = false;
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry fileName in vvv)
{
string name = fileName.getFilename();
if (name == dirName)
{
nameSame = true;
MessageBox.Show("专案名重复,请重新再取!","警告!");
break;
}
}
if (!nameSame)
{
m_sftp.mkdir(defRemotePath + dirName);
mkdirSuccess = true;
}
}
public bool MkSubdir(string parentDir, string subDir)
{
if (mkdirSuccess&!nameSame)
{
m_sftp.mkdir(defRemotePath + parentDir + "/" + subDir);
return true;
}
return false;
}
//SFTP存放文件
public bool Put(string localPath, string remotePath)
{
try
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);
m_sftp.put(src, dst);
return true;
}
catch
{
return false;
}
}
//第一次导图
public bool Put(string localPath, string localFileName, string proName, string remoteDirName)
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath + @"\" + localFileName);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(defRemotePath + proName + "/" + remoteDirName + "/");
try
{
m_sftp.put(src, dst);
return true;
}
catch
{
return false;
}
}
//续传图片
public bool Put(string localFileName, string proName, string remoteDirName)
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localFileName);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(defRemotePath + proName + "/" + remoteDirName + "/");
try
{
m_sftp.put(src, dst);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 数据库插入专案和镜头信息
/// </summary>
/// <param name="proName">专案名</param>
public void PutInsertAddr_Pro(string proName)
{
#region//插入专案 镜头信息
mySql.GetConn();
mySql.myConn.Open();
if (mySql.myConn.State.ToString() == "Open")
{
try
{
string insertCmd = "INSERT INTO u_project (pro_id,pro_name,pro_visible,pro_psdate,pro_pedate,pro_asdate,pro_aedate,pro_priority,pro_cover,pro_status,pro_createby,pro_manager,pro_createtime,pro_lownum,pro_length,pro_fps,pro_width,pro_height)VALUES ('','" + proName + "',1,NOW(),NOW(),NOW(),NOW(),100,'','on',1,1,NOW(),0,0,0,0,0);";
insertCmd += "INSERT INTO u_shot(shot_id,shot_manager,shot_num,shot_cover,shot_priority,shot_lock,shot_pro) VALUES('',121,1,'',100,0,(SELECT pro_id FROM u_project WHERE pro_name='" + proName + "'));";
myTrans = mySql.myConn.BeginTransaction();
mycom = new MySqlCommand(insertCmd, mySql.myConn);
mycom.Transaction = myTrans;
try
{
mycom.ExecuteNonQuery();
myTrans.Commit();
mkdirSuccess = true;
}
catch
{
try { myTrans.Rollback(); MessageBox.Show("专案插入信息错误,数据进行了回滚", "u_project"); }
catch (MySqlException ex)
{
if (myTrans.Connection != null)
{ MessageBox.Show("回滚失败! 异常类型: " + ex.GetType()); }
}
}
finally
{
mycom.Dispose();
myTrans.Dispose();
}
}
catch (Exception e)
{
mkdirSuccess = false;
MessageBox.Show("专案、镜头插入信息语句错误"+e.Message);
}
finally
{
mySql.myConn.Close();
mySql.myConn.Dispose();
}
MessageBox.Show("专案、镜头插入信息完毕!");
}
#endregion
}
/// <summary>
/// 数据库插入图片信息
/// </summary>
/// <param name="proName">专案名</param>
/// <param name="localPath">本地图片文件夹地址</param>
public void PutInsertAddr_Pic(string proName,string localPath)
{
mySql.GetConn();
mySql.myConn.Open();
if (mySql.myConn.State.ToString() == "Open")
{
DirectoryInfo dirInfo = new DirectoryInfo(localPath);
FileInfo[] fi = dirInfo.GetFiles();
string insertAddr = "START TRANSACTION";
mycom = new MySqlCommand(insertAddr, mySql.myConn);
mycom.ExecuteNonQuery();
try
{
foreach (FileInfo file in fi)
{
string name = file.Name;
insertAddr = "INSERT INTO u_picture (pic_id,pro_id,pic_num,pic_type,pic_status,pic_priority,pic_shot,pic_savetime,pic_version,pic_score,pic_lock,pic_reviewer,pic_painter,pic_thum,pic_addr,pic_crc,pic_background,pic_worktime) VALUES('',(SELECT pro_id FROM u_project WHERE pro_name='" + proName + "'),'" + name.Remove(name.IndexOf(".")) + "','depth map','new',100,(SELECT shot_id FROM u_shot WHERE shot_pro=(SELECT pro_id FROM u_project WHERE pro_name='" + proName + "')),'1990-01-01 00:00:00',1,0,0,121,121,'" + proName + "/thum/" + file.Name + "','" + proName + "/ori/" + name + "','OFF','no',0)";
mycom = new MySqlCommand(insertAddr, mySql.myConn);
mycom.ExecuteNonQuery();
}
insertAddr = "COMMIT";
mycom = new MySqlCommand(insertAddr, mySql.myConn);
mycom.ExecuteNonQuery();
}
catch (Exception ee)
{
insertAddr = "ROLLBACK";
mycom = new MySqlCommand(insertAddr, mySql.myConn);
mycom.ExecuteNonQuery();
MessageBox.Show("图片信息插入失败!", "图片地址插入错误!" + ee.Message);
}
MessageBox.Show("图片信息插入完毕!");
}
mySql.myConn.Close();
mySql.myConn.Dispose();
mycom.Dispose();
}
/// <summary>
/// 数据库增加镜头信息
/// </summary>
/// <param name="modifyProName">指定专案名</param>
public void PutAddShot(string modifyProName)
{
mySql.GetConn();
mySql.myConn.Open();
if (mySql.myConn.State.ToString() == "Open")
{
string insertShotCmd = "INSERT INTO u_shot(shot_id,shot_manager,shot_num,shot_cover,shot_priority,shot_lock,shot_pro) VALUES('',121,1,'',100,0,(SELECT pro_id FROM u_project WHERE pro_name='" + modifyProName + "'))";
mycom = new MySqlCommand(insertShotCmd, mySql.myConn);
try
{
mycom.ExecuteNonQuery();
}
catch (Exception ef)
{
MessageBox.Show("镜头新增信息失败!"+ef.Message);
}
}
mycom.Dispose();
mySql.myConn.Close();
mySql.myConn.Dispose();
}
/// <summary>
/// 在数据库更加镜头封面
/// </summary>
/// <param name="proName">专案名</param>
/// <param name="thumName">缩略图文件名</param>
/// <returns></returns>
public bool PutInsertShotCover(string proName,string thumName)
{
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(defRemotePath + proName+"/"+thumName);
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry fileName in vvv)
{
string name = fileName.getFilename();
mySql.GetConn();
mySql.myConn.Open();
if (mySql.myConn.State.ToString() == "Open")
{
string modfiyShot = "SELECT shot_id ,shot_cover FROM u_shot WHERE shot_pro=(SELECT pro_id FROM u_project WHERE pro_name='" + proName + "') ORDER BY shot_id DESC";
MySqlDataAdapter myada = new MySqlDataAdapter(modfiyShot,mySql.myConn);
dsShot.Clear();
myada.Fill(dsShot,"shotID"); //查出该专案的最新shotID,导入图片后shotID最大。
myada.Dispose();
int shotid =Convert.ToInt32(dsShot.Tables["shotID"].Rows[0]["shot_id"]);
string updateShotAddr = "update u_shot set shot_cover='" + proName + "/" + thumName + "/" + name + "' where shot_id='" + shotid + "' and shot_pro=(SELECT pro_id FROM u_project WHERE pro_name='" + proName + "')";
mycom = new MySqlCommand(updateShotAddr, mySql.myConn);
mycom.ExecuteNonQuery();
mycom.Dispose();
}
mySql.myConn.Close();
mySql.myConn.Dispose();
return true;
}
return false;
}
//SFTP获取文件
public bool Get(string remotePath, string localPath)
{
try
{
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);
m_sftp.get(src, dst);
return true;
}
catch
{
return false;
}
}
//删除SFTP文件
public bool Delete(string remoteFile)
{
try
{
m_sftp.rm(remoteFile);
return true;
}
catch
{
return false;
}
}
//获取SFTP文件列表
public ArrayList GetFileList(string remotePath, string fileType)
{
try
{
Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);
ArrayList objList = new ArrayList();
foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)
{
string sss = qqq.getFilename();
if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))
{ objList.Add(sss); }
else { continue; }
}
return objList;
}
catch
{
return null;
}
}
//登录验证信息
public class MyUserInfo : UserInfo
{
String passwd;
public String getPassword() { return passwd; }
public void setPassword(String passwd) { this.passwd = passwd; }
public String getPassphrase() { return null; }
public bool promptPassphrase(String message) { return true; }
public bool promptPassword(String message) { return true; }
public bool promptYesNo(String message) { return true; }
public void showMessage(String message) { }
}
}
}
C# 直接访问sftp进行相应的操作
最新推荐文章于 2024-06-21 10:32:30 发布