SuperDesign/Source/RySmartEditor/FTP/FrmFTPBrowser.cs
zilinsoft 993f1ca1a9 ### 2024-12-20 星期五更新
------
#### SuperDesign    V3.0.2412.2001
- *.[新增]新增程序更新日志设置和自动发布功能。
- *.[修复]修复Post数据格式不正确时双击文本框会导致软件闪退的BUG。
2024-12-20 08:15:19 +08:00

1127 lines
51 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using FTPop;
using GameBackup3H3.DbOp;
using ryCommon;
using ryCommonDb;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinSCP;
using .Manager.FTP;
using .Manager;
using BrightIdeasSoftware;
using WeifenLuo.WinFormsUI.Docking;
using .Tools.SmartEditor;
using SuperDesign.Tools.SmartEditor;
using ObjectListViewDemo;
using System.IO;
using ScintillaNET;
using DiffPlex.Model;
using ryControls.Interface;
using static System.Net.WebRequestMethods;
using ryControls;
using static VPKSoft.ScintillaLexers.LexerEnumerations;
using VPKSoft.ScintillaLexers;
using TheArtOfDev.HtmlRenderer.Adapters.Entities;
using static ScintillaNET.Style;
using RySmartEditor.Controls;
using ExtendUI.FTPManager;
namespace SuperDesign.Manager.FTP
{
public partial class FrmFTPBrowser : DockContent
{
public FrmFTPBrowser()
{
InitializeComponent();
OlvFileName.AspectGetter = (x) => { return ((FTPop.RemoteFileInfo)x)?.Name; };
OlvFileName.ImageGetter = delegate (object x) {
var item = (FTPop.RemoteFileInfo)x;
if (item == null) { return ""; }
return GetImageIndex(item.IsDirectory,System.IO.Path.GetExtension(item.Name));
};
OlvFileSize.AspectGetter = (x) => { return ((FTPop.RemoteFileInfo)x).IsDirectory ? 0L : ((FTPop.RemoteFileInfo)x).Length; };
OlvFileSize.AspectToStringConverter = (rowdata, x) => { return ((long)x) == 0 ? "-" : RyFiles.GetFileSizeStr((long)x); };
OlvFileType.AspectGetter = (x) => { return ((FTPop.RemoteFileInfo)x).IsDirectory ? "文件夹" : "文件"; };
OlvLastWriteTime.AspectGetter = (x) => {
var item = (FTPop.RemoteFileInfo)x;
if(item.Name=="." || item.Name == "..") { return "-"; }
return item.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
};
procUse = true;
CbbMatch.SelectedIndex = 0;
procUse = false;
objectListView1.PrimarySortColumn = OlvFileType;
objectListView1.PrimarySortOrder = SortOrder.Descending;
objectListView1.SecondarySortColumn = OlvLastWriteTime;
objectListView1.SecondarySortOrder = SortOrder.Descending;
SetupDragAndDrop();
}
private void SetupDragAndDrop()
{
// Drag and drop support
// Indicate that the OLV can be used to drag items out.
// You can write this code, or you can set IsSimpleDropSource to true (in the Designer).
this.objectListView1.DragSource = new SimpleDragSource();
// Indicate that the OLV can be accept items being dropped on it.
// These items could come from an ObjectListView or from some other control (or even
// from another application).
// If the drag source is an ObjectListView, you can listen for ModelCanDrop and
// ModelDropped events, which have some extra properties to make your life easier.
// If the drag source is not an ObjectListView, you have to listen for CanDrop and
// Dropped events, and figure out everything for yourself.
SimpleDropSink dropSink = new SimpleDropSink();
dropSink.CanDropOnItem = true;
//dropSink.CanDropOnSubItem = true;
dropSink.FeedbackColor = Color.IndianRed; // just to be different
this.objectListView1.DropSink = dropSink;
// For our purpose here, we will make it that if you drop one or more person
// onto someone, they all become married.
dropSink.ModelCanDrop += delegate (object sender, ModelDropEventArgs e) {
FTPop.RemoteFileInfo file = e.TargetModel as FTPop.RemoteFileInfo;
if (file == null)
e.Effect = DragDropEffects.None;
else
{
if (!file.IsDirectory)
{
e.Effect = DragDropEffects.None;
e.InfoMessage = "不能拖放到文件";
}
else
e.Effect = DragDropEffects.Link;
}
};
dropSink.ModelDropped += delegate (object sender, ModelDropEventArgs e) {
if (e.TargetModel == null)
return;
var item = (FTPop.RemoteFileInfo)e.TargetModel;
var from_list = e.SourceModels;
var del_list = new List<FTPop.RemoteFileInfo>();
if (GetFTP().IsOpen)
{
try
{
for (int i = 0; i < from_list.Count; i++)
{
var from_item = (FTPop.RemoteFileInfo)from_list[i];
var result = GetFTP().MoveFile(from_item.FullName, item.FullName+"/"+System.IO.Path.GetFileName(from_item.FullName));
if (result>=0)
{
del_list.Add(from_item);
}
else
{
MessageBox.Show("移动失败=>" + from_item.FullName, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
this.Invoke(new Action(() => {
MessageBox.Show(ex.Message + "\r\n" + ex.Source, "出错", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}));
}
}
objectListView1.RemoveObjects(del_list);
};
TxtFtpPath.AllowDrop = true;
TxtFtpPath.DragEnter += Form_DragEnter;
TxtFtpPath.DragDrop += Form_DragDrop;
}
private void Form_DragDrop(object sender, DragEventArgs e)
{
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
List<UploadInfo> UploadList = new List<UploadInfo>();
for (int i = 0; i < s.Length; i++)
{
var uploadinfo = new UploadInfo()
{
FtpInfo =this.Cur_FTPInfo,
RemotePath = CurFolder.TrimEnd('/')+"/"+System.IO.Path.GetFileName(s[i]),
LocalPath = s[i]
};
UploadList.Add(uploadinfo);
}
if (UploadList.Count > 0)
{
FrmUploadProg frm = new FrmUploadProg();
frm.UploadList.AddRange(UploadList);
if (frm.ShowDialog() == DialogResult.OK)
{
ToolStripMenuItem.PerformClick();
//MessageBox.Show("上传成功。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("上传失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
frm.Dispose();
}
}
private void Form_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.All;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private int GetImageIndex(bool isDir,string ext)
{
string path;
if(isDir)
{
path = System.Environment.SystemDirectory;
if (imageListSmall.Images.ContainsKey("|folder"))
return imageListSmall.Images.IndexOfKey("|folder");
try
{
imageListSmall.Images.Add("|folder", ShellUtilities.GetFileIcon(path, true, true));
return imageListSmall.Images.IndexOfKey("|folder");
}
catch (ArgumentNullException)
{
return -1;
}
}
else
{
if (imageListSmall.Images.ContainsKey(ext))
return imageListSmall.Images.IndexOfKey(ext);
try
{
imageListSmall.Images.Add(ext, ShellUtilities.GetFileIcon(ext, true, true));
return imageListSmall.Images.IndexOfKey(ext);
}
catch (ArgumentNullException)
{
return -1;
}
}
}
public void TimedFilter(BrightIdeasSoftware.ObjectListView olv, string txt, int matchKind)
{
BrightIdeasSoftware.TextMatchFilter filter = null;
if (!String.IsNullOrEmpty(txt))
{
switch (matchKind)
{
case 0:
default:
filter = BrightIdeasSoftware.TextMatchFilter.Contains(olv, txt);
break;
case 1:
filter = BrightIdeasSoftware.TextMatchFilter.Prefix(olv, txt);
break;
case 2:
filter = BrightIdeasSoftware.TextMatchFilter.Regex(olv, txt);
break;
}
}
// Text highlighting requires at least a default renderer
if (olv.DefaultRenderer == null)
olv.DefaultRenderer = new BrightIdeasSoftware.HighlightTextRenderer(filter);
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
olv.AdditionalFilter = filter;
//olv.Invalidate();
stopWatch.Stop();
}
private void FTPBrowser_Load(object sender, EventArgs e)
{
Resizes();
}
private void TxtSearch_TextChanged2(object sender, EventArgs e)
{
TimedFilter(this.objectListView1, ((ryControls.TextBoxEx2)sender).Text, this.CbbMatch.SelectedIndex);
}
public int FTPId { get; set; } = 0;
private bool IsRunning { get; set; } = false;
public GameBackup3H3.DbOp.FTPInfo Cur_FTPInfo
{
get;private set;
}
private IFTP Cur_Ftp { get; set; } =null;
private string Error_Msg { get; set; } = "";
private IFTP GetFTP()
{
if(Cur_Ftp==null || !Cur_Ftp.IsOpen)
{
var ftp = new FTPop.FTPWinSCP();
ftp.Open(Cur_FTPInfo);
Error_Msg = ftp.ErrorMsg;
Cur_Ftp = ftp;
}
return Cur_Ftp;
}
private void LoadFTPInfo(bool noLoadFiles=false)
{
if (IsRunning) { return; }
IsRunning = true;
TaskStartState();
Thread th = new Thread(Start);
th.Start();
void Start()
{
#region ftp信息
try
{
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
DataSet ds = db.ReadData("select * from Ftp where Id=" + FTPId);
if (ds.HaveData())
{
//DirectoryInfo fileSystemInfo =new DirectoryInfo("");
//fileSystemInfo.GetFileSystemInfos()
DataRow row = ds.Tables[0].Rows[0];
var FtpInfo = new GameBackup3H3.DbOp.FTPInfo()
{
Id = row["id"].ToInt(),
Name = row["name"].ToString(),
IP = row["ip"].ToString(),
Port = row["port"].ToInt(),
RemoteDir = row["remoteDir"].ToString(),
UserName = row["username"].ToString(),
Pwd = row["pwd"].ToString(),
Encrypt = row["encrypt"].ToInt(0, 2, 0),
AddTime = row["AddTime"].ToDateTime()
};
Cur_FTPInfo = FtpInfo;
if (!noLoadFiles)
{
CurFolder = FtpInfo.RemoteDir;
if (CurFolder.Length == 0) { CurFolder = "/"; }
this.Invoke(new Action(() =>
{
TxtFtpPath.Text = CurFolder;
}));
var ftp = new FTPop.FTPWinSCP();
var opened = ftp.Open(FtpInfo);
if (opened == 1)
{
Cur_Ftp = ftp;
var result = ftp.ListDirectory(CurFolder, out var error);
objectListView1.AddObjects(result);
if(error.Length>0)
{
this.Invoke(new Action(() =>
{
MessageBox.Show(error, "FTP错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
}));
}
}
else
{
this.Invoke(new Action(() =>
{
MessageBox.Show("FTP打开失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}));
}
}
}
ds.Dispose();
}
db.Free();
}
catch (Exception ex)
{
}
#endregion
this.Invoke(new Action(() =>
{
TaskEndState();
IsRunning = false;
}));
}
}
/// <summary>
/// 初始化到指定目录
/// </summary>
/// <param name="CurFolder"></param>
public void Init(string CurFolder)
{
LoadFTPInfo(true);
if (CurFolder.Length == 0)
{
GotoDir("/");
}
else
{
GotoDir(CurFolder);
}
}
/// <summary>
/// 初始化到指定目录
/// </summary>
/// <param name="CurFolder"></param>
public void InitByNoFiles(string CurFolder)
{
LoadFTPInfo(true);
this.CurFolder = CurFolder.Length==0?"/": CurFolder;
TxtFtpPath.Text = this.CurFolder;
objectListView1.Enabled = false;
BtnUp.Enabled = false;
BtnMustUpdate.Visible = true;
}
/// <summary>
/// 初始化到默认目录
/// </summary>
public void Init()
{
LoadFTPInfo();
}
private void TaskStartState(bool clear=true)
{
label1.Text = "正在加载....";
PnlState.Visible = true;
TxtSearch.Enabled = false;
CbbMatch.Enabled = false;
BtnUp.Enabled = false;
objectListView1.Enabled = false;
if (clear)
objectListView1.ClearObjects();
objectListView1.AllColumns[0].Text = "文件名(" + objectListView1.GetItemCount() + ")";
}
private void TaskEndState()
{
this.Invoke(new Action(() =>
{
objectListView1.AllColumns[0].Text = "文件名(" + objectListView1.GetItemCount() + ")";
PnlState.Visible = false;
objectListView1.Enabled = true;
BtnUp.Enabled = true;
TxtSearch.Enabled = true;
CbbMatch.Enabled = true;
}));
}
readonly bool procUse = false;
private void CbbMatch_SelectedIndexChanged(object sender, EventArgs e)
{
if (procUse) { return; }
TimedFilter(this.objectListView1, TxtSearch.Text, this.CbbMatch.SelectedIndex);
}
public string CurFolder { get; private set; } = "";
private void ObjectListView1_DoubleClick(object sender, EventArgs e)
{
var rfile = (FTPop.RemoteFileInfo)objectListView1.SelectedObjects[0];
if (rfile == null) { return; }
if (rfile.IsDirectory)
{
if (CurFolder.TrimEnd('/').Length == 0)
{
CurFolder = rfile.Name == ".." ? "/" : (rfile.FullName);
}
else
{
if (rfile.Name == "..")
{
CurFolder = System.IO.Path.GetDirectoryName(CurFolder.TrimEnd('/')).Replace("\\", "/").Replace("//", "/");
}
else
{
CurFolder = CurFolder.TrimEnd('/').Replace("\\", "/").Replace("//", "/") + "/" + rfile.Name;
}
}
GotoDir(CurFolder);
}
else
{
if(rfile.Length>=1024*1024*10)
{
MessageBox.Show("大于10MB的FTP文件暂时不支持编辑。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (Itrycn_Db.WinSCP_IsRunning())
{
MessageBox.Show("检测到外部FTP相关软件正在运行,建议关闭后编辑。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
var siteinfo = new SiteInfo();
bool noedit = false;
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
siteinfo.FtpId = FTPId;
DataSet ds_site = db.ReadData("select * from Site where FtpId=" + FTPId);
if (ds_site.HaveData())
{
for (int i = 0; i < ds_site.Tables[0].Rows.Count; i++)
{
DataRow reader = ds_site.Tables[0].Rows[i];
if(rfile.FullName.IndexOfEx(reader["ftpDir"].ToString())==0)
{
var local_file = reader["localPath"].ToString().Trim('\\')+"\\"+ rfile.FullName.Substring(reader["ftpDir"].ToString().Length).Trim('/');
if(System.IO.File.Exists(local_file))
{
if(RyFiles.GetFileDate(local_file).LastWriteTime.ToInt64() > rfile.LastWriteTime.ToInt64())
{
switch (MessageBox.Show("当前本地文件日期比服务器上的要新,是否要编辑服务器文件?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
noedit = true;
break;
}
}
else if (RyFiles.GetFileDate(local_file).LastWriteTime.ToInt64() == rfile.LastWriteTime.ToInt64())
{
if (RyFiles.GetFileSize(local_file) != rfile.Length)
{
switch (MessageBox.Show("当前本地文件与服务器文件日期一致,但大小不一致,是否要编辑服务器文件?\r\n\r\n本地:" + RyFiles.GetFileSizeStr(local_file) + "=>服务器:" + RyFiles.GetFileSizeStr(rfile.Length), "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
noedit = true;
break;
}
}
}
}
siteinfo.Name = reader["name"].ToString();
siteinfo.LocalPath = reader["localPath"].ToString();
siteinfo.FtpDir = reader["ftpDir"].ToString();
siteinfo.Id = reader["Id"].ToInt();
break;
}
}
}
ds_site.Dispose();
}
db.Free();
if(!noedit)
_ = FrmMainEditor.MainEditor.OpenFTPFileByNewForm(siteinfo, rfile.FullName);
}
}
private void GotoDir(string folder_path)
{
if (IsRunning) { return; }
IsRunning = true;
TaskStartState();
new Thread(Start).Start();
void Start()
{
IFTP ftp = GetFTP();
if (ftp.IsOpen)
{
this.Invoke(new Action(() =>
{
TxtFtpPath.Text = folder_path;
}));
var result = ftp.ListDirectory(folder_path, out var error);
this.Invoke(new Action(() =>
{
objectListView1.AddObjects(result);
}));
if (error.Length > 0)
{
this.Invoke(new Action(() =>
{
MessageBox.Show(error, "FTP错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
}));
}
else
{
}
}
else
{
this.Invoke(new Action(() =>
{
MessageBox.Show("FTP打开失败=>"+ Error_Msg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}));
}
ftp.Close();
TaskEndState();
IsRunning = false;
}
}
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
FrmTitle frm = new FrmTitle();
frm.TxtTitle.Text = Text;
frm.Text = "请输入重命名的名称";
if (frm.ShowDialog() == DialogResult.OK)
{
Text = frm.TxtTitle.Text;
}
frm.Dispose();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
GotoDir(CurFolder);
}
private void FrmFTPBrowser_FormClosing(object sender, FormClosingEventArgs e)
{
if (IsRunning) { e.Cancel = true; }
}
private void FrmFTPBrowser_ResizeEnd(object sender, EventArgs e)
{
}
private void Resizes()
{
BtnMustUpdate.Left = objectListView1.Left + (objectListView1.Width - BtnMustUpdate.Width) / 2;
BtnMustUpdate.Top = objectListView1.Top + (objectListView1.Height - BtnMustUpdate.Height) / 2;
PnlState.Left = objectListView1.Left;
PnlState.Width = objectListView1.Width;
}
private void BtnMustUpdate_Click(object sender, EventArgs e)
{
if(Itrycn_Db.WinSCP_IsRunning()) {
MessageBox.Show("外部FTP软件正在运行,部分功能将不可用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
BtnUp.Enabled = true;
objectListView1.Enabled = true;
BtnMustUpdate.Visible = false;
ToolStripMenuItem.PerformClick();
}
private void FrmFTPBrowser_SizeChanged(object sender, EventArgs e)
{
Resizes();
}
private void ObjectListView1_SelectionChanged(object sender, EventArgs e)
{
var rfile = (FTPop.RemoteFileInfo)objectListView1.SelectedObject;
label6.ForeColor = Color.Black;
label7.Visible = false;
if (rfile == null) { label5.Text = "无"; label6.Text = "无"; return; }
if (rfile.Name == "." || rfile.Name == "..") { label5.Text = "无"; label6.Text = "无"; return; }
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
DataSet ds_site = db.ReadData("select * from Site where FtpId=" + FTPId);
if (ds_site.HaveData())
{
for (int i = 0; i < ds_site.Tables[0].Rows.Count; i++)
{
DataRow reader = ds_site.Tables[0].Rows[i];
if (rfile.FullName.IndexOfEx(reader["ftpDir"].ToString()) == 0)
{
var local_file = reader["localPath"].ToString().Trim('\\') + "\\" + rfile.FullName.Substring(reader["ftpDir"].ToString().Length).Trim('/').Replace("/","\\");
string file_dt;
if (System.IO.Directory.Exists(local_file))
{
label5.Text = "不支持文件夹";
file_dt = "[本地]" + RyFiles.GetFileDate(local_file).LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
}
else if (System.IO.File.Exists(local_file))
{
var local_filesize = RyFiles.GetFileSize(local_file);
var local_filetime =RyFiles.GetFileDate(local_file).LastWriteTime;
if (local_filetime.ToInt64() > rfile.LastWriteTime.ToInt64()) {
label7.ForeColor = Color.Red;
label7.Text = "本地文件比较新";
label7.Visible = true;
label6.ForeColor = Color.Red;
}
else if (local_filetime.ToInt64() < rfile.LastWriteTime.ToInt64()) {
label7.ForeColor = Color.Blue;
label7.Text = "FTP文件比较新";
label7.Visible = true;
label6.ForeColor = Color.Blue;
}
else if (local_filetime.ToInt64() == rfile.LastWriteTime.ToInt64())
{
if(local_filesize!= rfile.Length)
{
label7.ForeColor = Color.Red;
label7.Text = "本地与FTP文件时间一致,但大小不一致";
}
else
{
label7.ForeColor = Color.Black;
label7.Text = "本地与FTP文件时间一致";
}
label7.Visible = true;
label6.ForeColor = Color.Black;
}
string start_size_str;
if(local_filesize>rfile.Length)
{ start_size_str = "本地大"; }
else if (local_filesize == rfile.Length)
{ start_size_str = "一样大"; }
else
{ start_size_str = "远程大"; }
label5.Text = "[本地]"+RyFiles.GetFileSizeStr(local_filesize) + "=>[远程]" + RyFiles.GetFileSizeStr(rfile.Length)+ "["+start_size_str+"]";
file_dt = "[本地]" + local_filetime.ToString("yyyy-MM-dd HH:mm:ss");
}
else
{
label5.Text = "[本地]无=>[远程]" + RyFiles.GetFileSizeStr(rfile.Length);
file_dt = "[本地]无";
}
label6.Text = file_dt +
"=>\r\n[远程]" + rfile.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
break;
}
}
}
ds_site.Dispose();
}
db.Free();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var rfile = (FTPop.RemoteFileInfo)objectListView1.SelectedObject;
if (rfile == null) {
if(objectListView1.SelectedObjects.Count>1) {
MessageBox.Show("无法打开多个。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
return;
}
if (rfile.Name == "." || rfile.Name == "..") { return; }
bool noedit = false;
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
DataSet ds_site = db.ReadData("select * from Site where FtpId=" + FTPId);
if (ds_site.HaveData())
{
for (int i = 0; i < ds_site.Tables[0].Rows.Count; i++)
{
DataRow reader = ds_site.Tables[0].Rows[i];
if (rfile.FullName.IndexOfEx(reader["ftpDir"].ToString()) == 0)
{
var local_file = reader["localPath"].ToString().Trim('\\') + "\\" + rfile.FullName.Substring(reader["ftpDir"].ToString().Length).Trim('/').Replace("/","\\");
if (System.IO.File.Exists(local_file))
{
if (RyFiles.GetFileDate(local_file).LastWriteTime.ToInt64() < rfile.LastWriteTime.ToInt64())
{
switch (MessageBox.Show("当前本地文件日期比服务器上的要老,是否要编辑本地文件?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
noedit = true;
break;
}
}
else if (RyFiles.GetFileDate(local_file).LastWriteTime.ToInt64() ==rfile.LastWriteTime.ToInt64())
{
if(RyFiles.GetFileSize(local_file)!=rfile.Length)
{
switch (MessageBox.Show("当前本地文件与服务器文件日期一致,但大小不一致,是否要编辑本地文件?\r\n\r\n本地:"+RyFiles.GetFileSizeStr(local_file)+"=>服务器:"+ RyFiles.GetFileSizeStr(rfile.Length), "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
noedit = true;
break;
}
}
}
if (!noedit) { FrmMainEditor.MainEditor.OpenFile(local_file); }
}
else if (System.IO.Directory.Exists(local_file))
{
RyFiles.OpenFile(local_file);
}
else {
MessageBox.Show("无法找到对应文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
break;
}
}
}
ds_site.Dispose();
}
db.Free();
}
public void UpdateFileInfo() {
ObjectListView1_SelectionChanged(objectListView1, EventArgs.Empty);
}
public void UpdateFileInfo(string path,DateTime LastWriteTime,long FileSize) {
var mpath = "/"+path.ToLower().TrimStart('/');
if(objectListView1.SelectedObject!=null)
{
var obj = (FTPop.RemoteFileInfo)objectListView1.SelectedObject;
if (obj.FullName.ToLower() == mpath)
{
obj.LastWriteTime = LastWriteTime;
obj.Length = FileSize;
objectListView1.RefreshObject(obj);
ObjectListView1_SelectionChanged(objectListView1, EventArgs.Empty);
return;
}
}
for (int i = 0; i < objectListView1.ObjectsList.Count; i++) {
var item = (FTPop.RemoteFileInfo)objectListView1.ObjectsList[i];
if (item.FullName.ToLower() == mpath) {
item.LastWriteTime = LastWriteTime;
item.Length = FileSize;
objectListView1.RefreshObject(item);
if(item==objectListView1.SelectedObject) {
ObjectListView1_SelectionChanged(objectListView1, EventArgs.Empty);
}
return;
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var rfile = (FTPop.RemoteFileInfo)objectListView1.SelectedObject;
if (rfile == null) { return; }
if (rfile.Name == "." || rfile.Name == "..") { return; }
UploadInfo uploadinfo = null;
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1)
{
DataSet ds = db.ReadData("select * from Ftp where Id=" + FTPId);
if (ds.HaveData())
{
DataRow row = ds.Tables[0].Rows[0];
var FtpInfo = new GameBackup3H3.DbOp.FTPInfo()
{
Id = row["id"].ToInt(),
Name = row["name"].ToString(),
IP = row["ip"].ToString(),
Port = row["port"].ToInt(),
RemoteDir ="/",
UserName = row["username"].ToString(),
Pwd = row["pwd"].ToString(),
Encrypt = row["encrypt"].ToInt(0, 2, 0),
AddTime = row["AddTime"].ToDateTime()
};
uploadinfo = new UploadInfo()
{
FtpInfo = FtpInfo,
RemotePath = rfile.FullName,
LocalPath = Application.StartupPath + "\\UserDb\\tmp\\FTP\\" + rfile.Name
};
}
ds.Dispose();
}
db.Free();
if (uploadinfo == null) { return; }
RyFiles.DeleteFile(uploadinfo.LocalPath);
FrmDownProg frm = new FrmDownProg();
frm.DownList.Add(uploadinfo);
if (frm.ShowDialog() == DialogResult.OK)
{
LexerType CurHighliteLang;
try
{
var LexerType = VPKSoft.ScintillaLexers.HelperClasses.LexerFileExtensions.LexerTypeFromFileName(uploadinfo.LocalPath);
CurHighliteLang = LexerType;
}
catch { CurHighliteLang = LexerType.Unknown; }
FrmHistoryView frm2 = new FrmHistoryView
{
FilePath = "[FTP:"+FTPId+"]" +rfile.FullName,
Content =RyFiles.ReadAllText(uploadinfo.LocalPath),
CurHighliteLang = CurHighliteLang,
SelectModeOn = true,
TopMost = this.TopMost
};
frm2.ShowDialog();
frm2.Dispose();
RyFiles.DeleteFile(uploadinfo.LocalPath);
}
frm.Dispose();
}
private void ObjectListView1_BeforeSorting(object sender, BeforeSortingEventArgs e)
{
}
private void BtnUp_Click(object sender, EventArgs e)
{
if (BtnMustUpdate.Visible) { return; }
BtnUp.Enabled = false;
objectListView1.Enabled = false;
if (CurFolder.TrimEnd('/').Length == 0)
{
CurFolder = "/";
}
else
{
CurFolder = System.IO.Path.GetDirectoryName(CurFolder.TrimEnd('/')).Replace("\\", "/").Replace("//", "/");
}
GotoDir(CurFolder);
BtnUp.Enabled = true;
objectListView1.Enabled = true;
}
private void ToolStripMenuItem_Click(object sender, EventArgs e) {
var list = objectListView1.SelectedObjects;
if (list.Count == 0) { return; }
if(list.Count>15)
{
MessageBox.Show("你选中了"+ list.Count+"项,即将进行下载。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
List<UploadInfo> DownList = new List<UploadInfo>();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1) {
if (Cur_FTPInfo != null) {
DataSet ds_site = db.ReadData("select * from Site where FtpId=" + FTPId);
if (ds_site.HaveData()) {
for (int r = 0; r < list.Count; r++) {
var rfile = (FTPop.RemoteFileInfo)list[r];
if (rfile == null) { continue; }
if (rfile.Name == "." || rfile.Name == "..") { continue; }
for (int i = 0; i < ds_site.Tables[0].Rows.Count; i++) {
DataRow reader = ds_site.Tables[0].Rows[i];
if (rfile.FullName.IndexOfEx(reader["ftpDir"].ToString()) == 0) {
var canReplace = true;
var local_file = reader["localPath"].ToString().Trim('\\') + "\\" + rfile.FullName.Substring(reader["ftpDir"].ToString().Length).Trim('/').Replace("/", "\\");
if (System.IO.File.Exists(local_file)) {
if (RyFiles.GetFileDate(local_file).LastWriteTime.ToInt64() >rfile.LastWriteTime.ToInt64()) {
switch (MessageBox.Show("当前服务器上的文件日期比本地的要旧,是否要替换?\r\n"+ local_file, "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)) {
case DialogResult.No:
canReplace = false;
break;
}
}
else if (RyFiles.GetFileDate(local_file).LastWriteTime.ToInt64() == rfile.LastWriteTime.ToInt64()) {
if (RyFiles.GetFileSize(local_file) != rfile.Length) {
switch (MessageBox.Show("当前本地文件与服务器文件日期一致,但大小不一致,是否要替换?\r\n"+ local_file + "\r\n\r\n本地:" + RyFiles.GetFileSizeStr(local_file) + "=>服务器:" + RyFiles.GetFileSizeStr(rfile.Length), "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)) {
case DialogResult.No:
canReplace = false;
break;
}
}
}
}
else if (System.IO.Directory.Exists(local_file)) {
canReplace = false;
}
if (canReplace) {
DownList.Add(new UploadInfo() {
FtpInfo = Cur_FTPInfo,
RemotePath = rfile.FullName,
LocalPath = local_file
});
}
break;
}
}
}
}
ds_site.Dispose();
}
}
db.Free();
if(DownList.Count==0) {
MessageBox.Show("当前选中的文件无法在本地找到对应目录。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
FrmDownProg frm = new FrmDownProg();
frm.DownList.AddRange(DownList);
if (frm.ShowDialog() == DialogResult.OK) {
if (DownList.Count == list.Count) {
MessageBox.Show("全部下载成功。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else {
MessageBox.Show("选中"+list.Count+"项,下载成功"+DownList.Count+"项。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
frm.Dispose();
if (DownList.Count > 0) {
foreach (IDockContent document in FrmMainEditor.MainEditor.DockPanel.DocumentsToArray()) {
// IMPORANT: dispose all panes.
if (document is FrmFileBrowser_New frm2) {
if (frm2.CurFolderPath.ToLower().Trim('\\') ==System.IO.Path.GetDirectoryName(DownList[0].LocalPath).ToLower().Trim('\\')) {
frm2.GotoPath(System.IO.Path.GetDirectoryName(DownList[0].LocalPath), DownList[0].LocalPath);
}
}
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e) {
var list = objectListView1.SelectedObjects;
if (list.Count == 0) { return; }
if (list.Count == 1)
{
switch (MessageBox.Show("确定要删除 " + ((FTPop.RemoteFileInfo)list[0]).Name + " ?这将不可恢复?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
return;
}
}
else
{
switch (MessageBox.Show("确定要删除选定的 " + list.Count + "项 FTP文件这将不可恢复", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
return;
}
}
if (IsRunning) { return; }
IsRunning = true;
TaskStartState(false);
new Thread(Start).Start();
void Start() {
this.Invoke(new Action(() => {
label1.Text = "正在加载FTP....";
}));
if (GetFTP().IsOpen) {
var error = 0;
var remove_list = new List<FTPop.RemoteFileInfo>();
for (int i = 0; i < list.Count; i++) {
var rfile = (FTPop.RemoteFileInfo)list[i];
if(rfile.Name=="." || rfile.Name == "..") {
continue;
}
this.Invoke(new Action(() => {
label1.Text = "正在删除第"+(i+1)+"个文件....";
}));
try {
if (GetFTP().DelFile(rfile.FullName) < 0) {
error++;
}
else {
remove_list.Add(rfile);
}
}catch(Exception ex) {
this.Invoke(new Action(() => {
MessageBox.Show(ex.Message+"\r\n"+ex.Source, "出错", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}));
error++;
}
}
this.Invoke(new Action(() => {
objectListView1.RemoveObjects(remove_list);
}));
if(error>0) {
this.Invoke(new Action(() => {
MessageBox.Show("删除时有"+error+"项失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}));
}
}
else {
this.Invoke(new Action(() => {
MessageBox.Show("FTP打开失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}));
}
TaskEndState();
IsRunning = false;
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void ObjectListView1_CellEditFinished(object sender, CellEditEventArgs e)
{
if (!e.Cancel)
{
var item = (FTPop.RemoteFileInfo)e.RowObject;
var new_filename = e.NewValue.ToString();
if (new_filename == e.Value.ToString()) { return; }
if (RyFiles.IsValidFileName(new_filename))
{
if (IsRunning) { return; }
IsRunning = true;
TaskStartState(false);
new Thread(Start).Start();
void Start()
{
this.Invoke(new Action(() => {
label1.Text = "正在加载FTP....";
}));
if (GetFTP().IsOpen)
{
try
{
var result = GetFTP().MoveFile(item.FullName, System.IO.Path.GetDirectoryName(item.FullName) + "/" + new_filename);
if(result>0)
{
item.FullName = System.IO.Path.GetDirectoryName(item.FullName) + "/" + new_filename;
item.Name = new_filename;
this.Invoke(new Action(() =>
{
objectListView1.RefreshObject(item);
}));
}
}
catch (Exception ex)
{
this.Invoke(new Action(() => {
MessageBox.Show(ex.Message + "\r\n" + ex.Source, "出错", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}));
}
}
else
{
this.Invoke(new Action(() => {
MessageBox.Show("FTP打开失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}));
}
TaskEndState();
IsRunning = false;
}
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var list = objectListView1.SelectedObjects;
if (list.Count == 0) { return; }
var txt = "";
for (int i = 0; i < list.Count; i++)
{
var rfile = (FTPop.RemoteFileInfo)list[i];
if (rfile.Name == "." || rfile.Name == "..")
{
continue;
}
if (txt.Length > 0) { txt += "\r\n"; }
txt+= rfile.Name;
}
RyFiles.CopyToClip(txt);
}
private void TxtFtpPath_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode==Keys.Enter)
{
if (BtnMustUpdate.Visible) {
objectListView1.Enabled = true;
BtnMustUpdate.Visible = false;
}
if (TxtFtpPath.Text.TrimEnd('/').Length == 0)
{
CurFolder = "/";
}
else
{
CurFolder = TxtFtpPath.Text.TrimEnd('/').Replace("\\", "/").Replace("//", "/");
}
BtnUp.Enabled = false;
objectListView1.Enabled = false;
GotoDir(CurFolder);
BtnUp.Enabled = true;
objectListView1.Enabled = true;
}
}
}
}