RaUI/Source/Itrycn_Project2/OTools/MdiForm/FrmFileBrowser_New.cs
zilinsoft 7ff45b3074 ## 📅2026-06-04 星期四更新
### RaUI    V4.0.2606.0401
- *.[新增]QuickWeb新增支持重试次数。
- *.[新增]RySetting类新增支持json格式设置存储和获取。
- *.[新增]RySetting类新增支持读取设置到内存,然后按配置名称读取。
- *.[新增]新增SuperFileSearch类,文件查找。
- *.[新增]QuickWeb新增CurPageUrl属性。
- *.[新增]HardWare新增支持获取显示器信息。
- *.[新增]HardWare新增GetWMI函数。
- *.[改进]QuickWeb类的UA从IE改为Edge。
- *.[改进]Hosts类IP与域名分隔符从\t改为三个空格。
- *.[改进]RyImage的CropOrFill函数,如果输入的长宽比例与原图一致,则返回原图的副本而不是原图。
- *.[改进]RySoft类的CompareVer函数支持特殊格式的版本号。
- *.[改进]QuickWeb的ConvertUrl函数新增支持自动从CurPageUrl获取。
- *.[改进]DateDiff函数对时间差异小于等于10秒的,自动加上毫秒数据。
- *.[修复]修复ObjectListView控件的AspectGetter方法可能调用null对象的问题。
- *.[修复]修复日期选择控件在获取节假日数据时,会因为节假日文件夹无法访问而报错的问题。
- *.[修复]修复某些情况下剪切板权限问题导致ObjectListView控件报错。
- *.[修复]修复RyImage的CropOrFill函数图片比例不一致时,也是返回原图副本的BUG。
### Itrycn_Project2    V1.0.2606.0401
- *.[改进]将公共调用,无需新增内容的部分代码,改到Public文件夹下
2026-06-04 09:40:37 +08:00

1099 lines
45 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 BrightIdeasSoftware;
using ryCommon;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
using WinShell;
namespace Itrycn_Project2
{
public partial class FrmFileBrowser_New : DockContent
{
public FrmFileBrowser_New()
{
InitializeComponent();
SetupColumns();
SetupList();
SetupDragAndDrop();
//olvFiles.FullRowSelect = false;
helper_tree = new SysImageListHelper(this.TreeDir);
olvFiles.CellEditActivation = ObjectListView.CellEditActivateMode.SingleClick;
TreeDir.AfterSelect += TreeDir_AfterSelect;
procUse = true;
CbbMatch.SelectedIndex = 0;
procUse = false;
}
private void TreeDir_AfterSelect(object sender, TreeViewEventArgs e)
{
var info = (MyFileSystemInfo)e.Node.Tag;
this.textBoxFolderPath.Text= info.FullName;
PopulateListFromPath(info.FullName);
if (e.Node.Nodes.Count == 0) { LoadDir(e.Node,1); }
}
SysImageListHelper helper_tree;
private void LoadDir(TreeNode parent,int index)
{
if (parent == null)
{
var drives = DriveInfo.GetDrives();
foreach (var drive in drives)
{
MyFileSystemInfo info = new MyFileSystemInfo(drive.RootDirectory, "");
var node = new TreeNode(drive.Name.Trim('\\') + " " + drive.VolumeLabel)
{
ImageIndex = helper_tree.GetImageIndex(drive.Name)
};
node.SelectedImageIndex = node.ImageIndex;
node.Tag = info;
TreeDir.Nodes.Add(node);
if(index<1 && (drive.DriveFormat=="NTFS" || drive.DriveFormat == "FAT32"))
{
LoadDir(node,0);
}
}
}
else
{
var parent_info = (MyFileSystemInfo)parent.Tag;
try
{
var list = parent_info.AsDirectory.GetDirectories();
for (int i = 0; i < list.Length; i++)
{
MyFileSystemInfo info = new MyFileSystemInfo(list[i], "");
var node = new TreeNode(list[i].Name)
{
ImageIndex = helper_tree.GetImageIndex(list[i].FullName)
};
node.SelectedImageIndex = node.ImageIndex;
node.Tag = info;
parent.Nodes.Add(node);
if (index < 1)
{
LoadDir(node, 1);
}
}
}
catch(Exception ex)
{
if(index==0)
MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
olvFiles.ClearObjects();
olvColumnName.Text = "文件名(" + olvFiles.GetItemCount() + ")";
}
}
}
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.olvFiles.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.olvFiles.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) {
MyFileSystemInfo file = e.TargetModel as MyFileSystemInfo;
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 = (MyFileSystemInfo)e.TargetModel;
var from_list= e.SourceModels;
var del_list = new List<MyFileSystemInfo>();
for (int i = 0; i < from_list.Count; i++)
{
var from_item = (MyFileSystemInfo)from_list[i];
if (ryCommon.RyFiles.MoveFile(from_item.FullName, item.FullName) == 0)
{
del_list.Add(from_item);
}
else
{
MessageBox.Show("移动失败=>"+from_item.FullName, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
olvFiles.RemoveObjects(del_list);
};
}
private void SetupColumns()
{
// The column setup here is identical to the File Explorer example tab --
// nothing specific to the TreeListView.
// The only difference is that we don't setup anything to do with grouping,
// since TreeListViews can't show groups.
// Get the size of the file system entity.
// Folders and errors are represented as negative numbers
this.olvColumnSize.AspectGetter = delegate (object x) {
MyFileSystemInfo myFileSystemInfo = (MyFileSystemInfo)x;
return myFileSystemInfo.Length;
};
// Show the size of files as GB, MB and KBs. By returning the actual
// size in the AspectGetter, and doing the conversion in the
// AspectToStringConverter, sorting on this column will work off the
// actual sizes, rather than the formatted string.
this.olvColumnSize.AspectToStringConverter = delegate (object rowdata, object x) {
long sizeInBytes = (long)x;
if (sizeInBytes < 0) // folder or error
return "";
return RyFiles.GetFileSizeStr(sizeInBytes);
};
this.olvColumnCreated.GroupKeyGetter = delegate (object x) {
DateTime dt = ((MyFileSystemInfo)x).CreationTime;
return new DateTime(dt.Year, dt.Month, 1);
};
this.olvColumnCreated.GroupKeyToTitleConverter = delegate (object x) {
return ((DateTime)x).ToString("MMMM yyyy");
};
// Group by month-year, rather than date
this.olvColumnModified.GroupKeyGetter = delegate (object x) {
DateTime dt = ((MyFileSystemInfo)x).LastWriteTime;
return new DateTime(dt.Year, dt.Month, 1);
};
this.olvColumnModified.GroupKeyToTitleConverter = delegate (object x) {
return ((DateTime)x).ToString("MMMM yyyy");
};
// Show the system description for this object
this.olvColumnFileType.AspectGetter = delegate (object x) {
return ShellUtilities.GetFileType(((MyFileSystemInfo)x).FullName);
};
}
private void SetupList() {
// We want to draw the system icon against each file name. SysImageListHelper does this work for us.
SysImageListHelper helper = new SysImageListHelper(this.olvFiles);
this.olvColumnName.ImageGetter = delegate (object x) { return helper.GetImageIndex(((MyFileSystemInfo)x).FullName); };
// Show tooltips when the appropriate checkbox is clicked
this.olvFiles.ShowItemToolTips = true;
this.olvFiles.CellToolTipShowing += delegate (object sender, ToolTipShowingEventArgs e) {
//if (this.showToolTipsOnFiles)
var row = (MyFileSystemInfo)e.Model;
e.Text = String.Format("文件名:{0}\r\n修改时间:{1}\r\n创建时间:{2}\r\n大小:{3}\r\n类型:{4}", row.Name, row.LastWriteTime.ToString(), row.CreationTime.ToString(), RyFiles.GetFileSizeStr(row.Length), ShellUtilities.GetFileType(row.FullName));
};
// Show a menu -- but only when the user right clicks on the first column
this.olvFiles.CellRightClick += delegate (object sender, CellRightClickEventArgs e) {
System.Diagnostics.Trace.WriteLine(String.Format("right clicked {0}, {1}). model {2}", e.RowIndex, e.ColumnIndex, e.Model));
// if (e.ColumnIndex == 0)
// e.MenuStrip = this.contextMenuStrip2;
};
}
private bool CopyMode { get; set; } = true;
private readonly ArrayList copy_or_cut_list = new ArrayList();
private void FrmFileBrowser_Load(object sender, EventArgs e)
{
}
private void FrmFileBrowser_FormClosing(object sender, FormClosingEventArgs e)
{
//drag.ElevatedDragDrop -= Drag_ElevatedDragDrop;
}
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();
}
public string CurFolderPath { get; set; } = "";
/// <summary>
/// 将当前路径的内容加载到列表里
/// </summary>
/// <param name="path"></param>
private void PopulateListFromPath(string path) {
if (String.IsNullOrEmpty(path))
return;
CurFolderPath = path;
if (MenuDirHistory.Items.Count > 10)
{
MenuDirHistory.Items.RemoveAt(MenuDirHistory.Items.Count - 1);
}
olvFiles.SelectedObjects=null;
ToolStripMenuItem item_menu = new ToolStripMenuItem();
item_menu.Text = path;
item_menu.Click += Item_menu_Click;
MenuDirHistory.Items.Insert(0, item_menu);
DirectoryInfo pathInfo = new DirectoryInfo(path);
if (!pathInfo.Exists)
{
olvFiles.ClearObjects();
olvColumnName.Text = "文件名(" + olvFiles.GetItemCount() + ")";
return;
}
Stopwatch sw = new Stopwatch();
Cursor.Current = Cursors.WaitCursor;
sw.Start();
try
{
var folder_list = pathInfo.GetDirectories();
var file_list = pathInfo.GetFiles();
List<MyFileSystemInfo> list = new List<MyFileSystemInfo>();
foreach (var x in folder_list)
{
list.Add(new MyFileSystemInfo(x, ""));
}
foreach (var x in file_list)
{
list.Add(new MyFileSystemInfo(x, ""));
}
this.olvFiles.SetObjects(list);
olvColumnName.Text = "文件名("+olvFiles.GetItemCount()+")";
fileSystemWatcher1.Path = CurFolderPath;
}
catch { }
sw.Stop();
Cursor.Current = Cursors.Default;
}
/// <summary>
/// 初始化加载的路径
/// </summary>
public string InitPath { get; set; } = "";
/// <summary>
/// 初始化选择的路径
/// </summary>
public string Init_Selected_Path { get; set; } = "";
public void GotoPath(string folder, string selected_path) {
if (TreeDir.Nodes.Count == 0)
{
LoadDir(null, 0);
}
if (folder.Length == 0)
{ olvFiles.ClearObjects();textBoxFolderPath.Text = ""; olvColumnName.Text = "文件名(" + olvFiles.GetItemCount() + ")"; return; }
this.textBoxFolderPath.Text=folder;
GotoTreePath(folder);
SelectedPath(selected_path);
}
private void SelectedPath(string selected_path)
{
var list = olvFiles.ObjectsList;
for (int i = 0; i < list.Count; i++)
{
var item = (MyFileSystemInfo)list[i];
if (item.FullName.ToLower() == selected_path.ToLower())
{
olvFiles.SelectedObject = item;
olvFiles.EnsureModelVisible(item);
break;
}
}
}
private void BtnGo_Click(object sender, EventArgs e) {
string path = this.textBoxFolderPath.Text;
this.PopulateListFromPath(path);
GotoTreePath(path);
}
public void GotoTreePath(string path)
{
var split_path = path.Split('\\');
TreeNode parent = null;
for (int i = 0; i < split_path.Length; i++)
{
var path_item = split_path[i].ToLower();
if(parent!=null)
{
if(parent.Nodes.Count==0)
{
LoadDir(parent,1);
}
}
foreach (TreeNode item in (parent==null?TreeDir.Nodes: parent.Nodes))
{
var info = (MyFileSystemInfo)item.Tag;
if (info.Name.Trim('\\').ToLower() == path_item)
{
parent = item;
break;
}
}
}
if(parent!=null)
{
if (parent.Nodes.Count == 0)
{
LoadDir(parent, 1);
}
TreeDir.SelectedNode = parent;
//TreeDir.en
}
}
private void Item_menu_Click(object sender, EventArgs e)
{
textBoxFolderPath.Text = ((ToolStripMenuItem)sender).Text;
BtnGo.PerformClick();
}
private void BtnUp_Click(object sender, EventArgs e) {
DirectoryInfo di = Directory.GetParent(this.textBoxFolderPath.Text);
if (di == null)
System.Media.SystemSounds.Asterisk.Play();
else {
this.textBoxFolderPath.Text = di.FullName;
this.BtnGo.PerformClick();
}
}
private void OlvFiles_MouseDoubleClick(object sender, MouseEventArgs e) {
ClickFiles();
}
private void ClickFiles()
{
MyFileSystemInfo model = (MyFileSystemInfo)this.olvFiles.SelectedObject;
if (model != null)
{
if (System.IO.Directory.Exists(model.FullName))
{
this.textBoxFolderPath.Text = model.FullName;
this.BtnGo.PerformClick();
return;
}
var ext = System.IO.Path.GetExtension(model.FullName).ToLower();
if ((";.rar;.zip;.7z;.iso;.tar;.tgz;.gzip;.apk;" +
".jpg;.bmp;.gif;.png;.webp;.jpeg;.tif;.tiff;.ico;.wmf;" +
".mp4;.mkv;.rmvb;.flv;.3gp;.wmv;.f4v;.mpg;.mpeg;.mov;" +
".mp3;.wav;.flac;.ogg;.wma;" +
".xls;.xlsx;.doc;.docx;.ppt;.pptx;.csv;" +
".exe;.msi;.jar;.msixbundle;").IndexOfEx(";" + ext + ";") >= 0)
{
RyFiles.OpenFile(model.FullName);
return;
}
RyFiles.OpenFile(model.FullName);
}
}
private void TextBoxFolderPath_KeyDown(object sender, KeyEventArgs e) {
if(e.KeyCode==Keys.Enter) {
BtnGo.PerformClick();
}
}
private void textBoxFolderPath_MouseDoubleClick(object sender, MouseEventArgs e) {
folderBrowserDialog1.SelectedPath= textBoxFolderPath.Text;
if (folderBrowserDialog1.ShowDialog()==DialogResult.OK) {
textBoxFolderPath.Text = folderBrowserDialog1.SelectedPath;
BtnGo.PerformClick();
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e) {
MyFileSystemInfo model = (MyFileSystemInfo)this.olvFiles.SelectedObject;
if (model != null) {
if (System.IO.Directory.Exists(model.FullName)) {
RyFiles.OpenFile(model.FullName);
return;
}
RyFiles.OpenFolderGotoFile(model.FullName);
}
}
public void UpdateFileInfo(string path) {
for (int i = 0; i < olvFiles.ObjectsList.Count; i++) {
var item = (MyFileSystemInfo)olvFiles.ObjectsList[i];
if (item.FullName.ToLower() == path.ToLower()) {
item.ReLoad();
olvFiles.RefreshObject(item);
olvFiles.Sort();
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var list = this.olvFiles.SelectedObjects;
if (list.Count>0)
{
var text = "";
for (int i = 0; i < list.Count; i++)
{
var row = (MyFileSystemInfo)list[i];
if (text.Length > 0) { text += "\r\n"; }
text += row.Name;
}
RyFiles.CopyToClip(text);
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
MyFileSystemInfo model = (MyFileSystemInfo)this.olvFiles.SelectedObject;
if (model == null) { return; }
FrmTitle frm = new FrmTitle();
frm.Text = "请输入重命名的名称";
frm.TxtTitle.Text = model.Name;
if (frm.ShowDialog() == DialogResult.OK)
{
//int num = arrayList2.IndexOf(model);
var new_fullname = System.IO.Path.GetDirectoryName(model.FullName) + "\\" + RyFiles.ConvertToValidFileName(frm.TxtTitle.Text);
if (RyFiles.MoveFile(model.FullName, new_fullname) == 0)
{
//treeListView.RemoveObject(model);
model.ReLoad(new_fullname);
model.Name = model.Name;
olvFiles.RefreshObject(model);
UpdateNode(TreeDir.SelectedNode);
}
else
{
MessageBox.Show("重命名失败", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
frm.Dispose();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var list = this.olvFiles.SelectedObjects;
if (list.Count > 0)
{
switch (MessageBox.Show("确定要删除选定的"+ list.Count + "个文件吗?这将不可恢复?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2))
{
case DialogResult.No:
return;
}
//var del_list=new List<MyFileSystemInfo>();
for (int i = 0; i < list.Count; i++)
{
var row = (MyFileSystemInfo)list[i];
RyFiles.DeleteFile(row.FullName);
//del_list.Add(row);
}
UpdateNode(TreeDir.SelectedNode);
//olvFiles.RemoveObjects(del_list);
}
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
var list = this.olvFiles.SelectedObjects;
ToolStripMenuItem.Enabled = list.Count > 0;
ToolStripMenuItem.Enabled = list.Count==1;
ToolStripMenuItem.Enabled = list.Count == 1;
ToolStripMenuItem.Enabled = list.Count > 0;
ToolStripMenuItem.Enabled = list.Count > 0;
ToolStripMenuItem.Enabled = list.Count > 0;
ToolStripMenuItem.Enabled = copy_or_cut_list.Count > 0;
try
{
ToolStripMenuItem.Enabled = Clipboard.GetFileDropList().Count > 0;
}
catch { }
}
private void UpdateNode(TreeNode node)
{
if(node == null) return;
var parent_info = (MyFileSystemInfo)node.Tag;
var dirs = parent_info.AsDirectory.GetDirectories();
Dictionary<string, int> dict = new Dictionary<string, int>();
Dictionary<string, int> dict_now = new Dictionary<string, int>();
for (int i = 0; i < dirs.Length; i++)
{
dict[dirs[i].FullName] = 1;
}
for (int i = node.Nodes.Count-1; i>=0; i--)
{
var info = node.Nodes[i].Tag as MyFileSystemInfo;
if(!dict.ContainsKey(info.FullName))
{
node.Nodes[i].Remove();
}
else
{
dict_now[info.FullName] = 1;
}
}
for (int i = 0; i < dirs.Length; i++)
{
if (!dict_now.ContainsKey(dirs[i].FullName))
{
MyFileSystemInfo info = new MyFileSystemInfo(dirs[i], "");
var node2 = new TreeNode(dirs[i].Name)
{
ImageIndex = helper_tree.GetImageIndex(dirs[i].FullName)
};
node2.SelectedImageIndex = node.ImageIndex;
node2.Tag = info;
node.Nodes.Add(node2);
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmTitle frm = new FrmTitle();
frm.Text = "请输入重命名的名称";
frm.TxtTitle.Text = "新建文件夹";
if (frm.ShowDialog() == DialogResult.OK)
{
var path = CurFolderPath + "\\" + frm.TxtTitle.Text;
if (System.IO.Directory.Exists(path))
{
MessageBox.Show("文件夹已存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
RyFiles.CreateDirectory(path);
var node = TreeDir.SelectedNode;
if(node!=null)
{
var info = (MyFileSystemInfo)node.Tag;
if(info.FullName.ToLower()== CurFolderPath.ToLower())
{
UpdateNode(node);
}
}
}
}
frm.Dispose();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Collections.Specialized.StringCollection list = new System.Collections.Specialized.StringCollection();
for (int i = 0; i < this.olvFiles.SelectedObjects.Count; i++)
{
var row = (MyFileSystemInfo)this.olvFiles.SelectedObjects[i];
list.Add(row.FullName);
}
DataObject data = new DataObject();
data.SetData("Preferred DropEffect", "COPY");
data.SetFileDropList(list);
Clipboard.SetDataObject(data);
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var error = 0;
var item = (MyFileSystemInfo)olvFiles.SelectedObject;
var exist_mode = -1000;
for (int i = 0; i< copy_or_cut_list.Count;i++)
{
var row = (MyFileSystemInfo)copy_or_cut_list[i];
var to_name=CurFolderPath + "\\" + row.Name;
if(item!=null && item.IsDirectory)
{
to_name= item.FullName+ "\\" + row.Name;
}
if(!RyFiles.FileOrDirExist(to_name))
{
if (CopyMode)
{
if(RyFiles.CopyFileOrFolder(row.FullName, to_name) != 0) { error++; }
}
else
{
if(RyFiles.MoveFile(row.FullName, to_name)!=0) { error++; }
}
}
else
{
if (exist_mode == -1000)
{
switch (MessageBox.Show("文件已存在,需要如何处理?\r\n是替换文件\r\n否拷贝一份副本\r\n取消:忽略", "询问", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly))
{
case DialogResult.Cancel:
exist_mode = 0;
break;
case DialogResult.No:
exist_mode = -1;
break;
case DialogResult.Yes:
exist_mode = 1;
break;
}
}
if (exist_mode == 0)
{
error++;
}
else if (exist_mode == -1)
{
var index = 1;
while(true)
{
var path = System.IO.Path.GetDirectoryName(to_name) + System.IO.Path.GetFileNameWithoutExtension(to_name) + "_副本" + index + System.IO.Path.GetExtension(to_name);
if (!RyFiles.FileOrDirExist(path))
{
to_name = path;
break;
}
index++;
}
if (CopyMode)
{
if (RyFiles.CopyFileOrFolder(row.FullName, to_name) != 0) { error++; }
}
else
{
if (RyFiles.MoveFile(row.FullName, to_name) != 0) { error++; }
}
}
else if (exist_mode == 1)//替换文件
{
if (row.FullName != to_name)
{
if (CopyMode)
{
if (RyFiles.CopyFileOrFolder(row.FullName, to_name) != 0) { error++; }
}
else
{
if (RyFiles.MoveFile(row.FullName, to_name) != 0) { error++; }
}
}
}
}
}
if (item != null && item.IsDirectory)
{
olvFiles.RemoveObjects(copy_or_cut_list);
}
else
{
olvFiles.AddObjects(copy_or_cut_list);
}
UpdateNode(TreeDir.SelectedNode);
if (error>0)
{
MessageBox.Show("粘贴出现错误,总文件数"+copy_or_cut_list.Count+"项,共有" + error+"项错误", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Collections.Specialized.StringCollection list = new System.Collections.Specialized.StringCollection();
for (int i = 0; i < this.olvFiles.SelectedObjects.Count; i++)
{
var row = (MyFileSystemInfo)this.olvFiles.SelectedObjects[i];
list.Add(row.FullName);
}
DataObject data = new DataObject();
data.SetData("Preferred DropEffect", "MOVE");
data.SetFileDropList(list);
Clipboard.SetDataObject(data);
}
private void OlvFiles_CellEditFinished(object sender, CellEditEventArgs e)
{
if(!e.Cancel)
{
var item = (MyFileSystemInfo)e.RowObject;
if(RyFiles.IsValidFileName(e.NewValue.ToString()))
{
var new_path = System.IO.Path.GetDirectoryName(item.FullName) + "\\" + e.NewValue.ToString();
if(RyFiles.MoveFile(item.FullName, new_path)==0)
{
item.ReLoad(new_path);
olvFiles.RefreshObject(item);
UpdateNode(TreeDir.SelectedNode);
}
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (TreeDir.SelectedNode == null) { return; }
TreeDir.SelectedNode.Nodes.Clear();
LoadDir(TreeDir.SelectedNode, 0);
}
private void FrmFileBrowser_New_Shown(object sender, EventArgs e)
{
if(TreeDir.Nodes.Count==0)
{
LoadDir(null, 0);
}
}
private void TreeDir_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button== MouseButtons.Right)
{
var node= TreeDir.GetNodeAt(e.Location);
if (node != null) { TreeDir.SelectedNode = node; }
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (TreeDir.SelectedNode == null) { return; }
var info = (MyFileSystemInfo)TreeDir.SelectedNode.Tag;
RyFiles.OpenFile(info.FullName);
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (TreeDir.SelectedNode == null) { return; }
var info = (MyFileSystemInfo)TreeDir.SelectedNode.Tag;
using (CShellFolder sf = new CShellFolder())
{
sf.ShowMenu(info.FullName, MousePosition, Handle);
UpdateNode(TreeDir.SelectedNode);
}
}
readonly bool procUse = false;
private void TxtSearch_TextChanged2(object sender, EventArgs e)
{
TimedFilter(this.olvFiles, ((ryControls.TextBoxEx2)sender).Text, this.CbbMatch.SelectedIndex);
}
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 CbbMatch_SelectedIndexChanged(object sender, EventArgs e)
{
if (procUse) { return; }
TimedFilter(this.olvFiles, TxtSearch.Text, this.CbbMatch.SelectedIndex);
}
private void BtnGo_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right) {
Button btn = (Button)sender;
Point p = new Point(0, btn.Height);
MenuDirHistory.Show(btn, p);
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
var data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.FileDrop, true))
{
var isCut = false;
try
{
MemoryStream vMemoryStream = (MemoryStream)data.GetData( "Preferred DropEffect", true);
if (vMemoryStream != null)
{
DragDropEffects vDragDropEffects = (DragDropEffects)vMemoryStream.ReadByte();
if ((vDragDropEffects & DragDropEffects.Move) == DragDropEffects.Move)
{
isCut = true;
}
}
}
catch { }
string[] files = (string[])data.GetData(DataFormats.FileDrop);
if (files.Length > 0)
{
var error = 0;
var exist_mode = -1000;
for (int i = 0; i < files.Length; i++)
{
var to_name = CurFolderPath + "\\" + System.IO.Path.GetFileName(files[i]);
var isDir = System.IO.Directory.Exists(files[i]);
if (isDir)
{
if (RyFiles.FileOrDirExist(to_name))
{
if (to_name == files[i])
{
to_name = GetNewPath(files[i]);
}
else
{
if (exist_mode == -1000)
{
switch (MessageBox.Show("文件已存在,需要如何处理?\r\n是替换文件\r\n否拷贝一份副本\r\n取消:忽略", "询问", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly))
{
case DialogResult.Cancel:
exist_mode = 0;
break;
case DialogResult.No:
exist_mode = -1;
break;
case DialogResult.Yes:
exist_mode = 1;
break;
}
}
if (exist_mode == 0)
{
error++;
}
else if (exist_mode ==-1)
{
to_name = GetNewPath(files[i]);
}
else if (exist_mode == 1)//替换文件
{
}
}
}
}
else
{
if (RyFiles.FileOrDirExist(to_name))
{
if (to_name == files[i])
{
to_name = GetNewPath(files[i]);
}
else
{
if (exist_mode == -1000)
{
switch (MessageBox.Show("文件已存在,需要如何处理?\r\n是替换文件\r\n否拷贝一份副本\r\n取消:忽略", "询问", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly))
{
case DialogResult.Cancel:
exist_mode = 0;
break;
case DialogResult.No:
exist_mode = -1;
break;
case DialogResult.Yes:
exist_mode = 1;
break;
}
}
if (exist_mode == 0)
{
error++;
}
else if (exist_mode == -1)
{
to_name = GetNewPath(files[i]);
}
else if (exist_mode == 1)//替换文件
{
}
}
}
}
string GetNewPath(string fromPath)
{
var filename = System.IO.Path.GetFileNameWithoutExtension(fromPath);
var ext = System.IO.Path.GetExtension(fromPath);
string path;
var index = 1;
while (true)
{
path = CurFolderPath + "\\" + filename + "_副本" + index + ext;
if (RyFiles.FileOrDirExist(path))
{
index++;
}
else { break; }
}
return path;
}
if (isCut)//表示移动文件
{
if (files[i] != to_name)
{
if (RyFiles.MoveFile(files[i], to_name) != 0) { error++; }
}
}
else
{
if (RyFiles.CopyFileOrFolder(files[i], to_name) != 0) { error++; }
else
{
if(!System.IO.Directory.Exists(to_name) && System.IO.Directory.Exists(files[i]))
{
RyFiles.CreateDirectory(to_name);
}
}
}
}
if (error > 0)
{
MessageBox.Show("粘贴出现错误,总文件数" + files.Length + "项,共有" + error + "项错误", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//BtnGo.PerformClick();
}
if(isCut)
{
Clipboard.Clear();
}
}
}
private void FileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
{
if (System.IO.File.Exists(e.FullPath))
{
olvFiles.AddObject(new MyFileSystemInfo(new FileInfo(e.FullPath), ""));
}
else if (System.IO.Directory.Exists(e.FullPath))
{
olvFiles.AddObject(new MyFileSystemInfo(new DirectoryInfo(e.FullPath), ""));
}
olvColumnName.Text = "文件名(" + olvFiles.GetItemCount() + ")";
}
private void FileSystemWatcher1_Deleted(object sender, FileSystemEventArgs e)
{
var list = olvFiles.ObjectsList;
for (int i = 0; i < list.Count; i++)
{
var row = (MyFileSystemInfo)list[i];
if(row.FullName==e.FullPath)
{
olvFiles.RemoveObject(row);
break;
}
}
olvColumnName.Text = "文件名(" + olvFiles.GetItemCount() + ")";
}
private void FileSystemWatcher1_Renamed(object sender, RenamedEventArgs e)
{
var list = olvFiles.ObjectsList;
for (int i = 0; i < list.Count; i++)
{
var row = (MyFileSystemInfo)list[i];
if (row.FullName == e.OldFullPath)
{
row.ReLoad(e.FullPath);
break;
}
}
}
private void FileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
{
if(e.ChangeType== WatcherChangeTypes.Changed)
{
var list = olvFiles.ObjectsList;
for (int i = 0; i < list.Count; i++)
{
var row = (MyFileSystemInfo)list[i];
if (row.FullName == e.FullPath)
{
row.ReLoad(e.FullPath);
break;
}
}
}
}
private void OlvFiles_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode==Keys.V && e.Control)
{
ToolStripMenuItem.PerformClick();
}
else if (e.KeyCode == Keys.C && e.Control)
{
ToolStripMenuItem.PerformClick();
}
else if (e.KeyCode == Keys.S && e.Control)
{
ToolStripMenuItem.PerformClick();
}
else if (e.KeyCode == Keys.Enter)
{
ClickFiles();
}
else if (e.KeyCode == Keys.Back)
{
var folder = CurFolderPath.ToLower();
olvFiles.Enabled = false;
BtnUp.PerformClick();
olvFiles.Enabled = true;
olvFiles.Focus();
var list = olvFiles.ObjectsList;
for (int i = 0; i < list.Count; i++)
{
var row = (MyFileSystemInfo)list[i];
if (row.FullName.ToLower() == folder)
{
olvFiles.SelectedObject = row;
break;
}
}
}
else if (e.KeyCode == Keys.Delete)
{
ToolStripMenuItem.PerformClick();
}
}
//private void FileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
//{
// if(CurFolderPath.Length>0 && e.FullPath.IndexOfEx(CurFolderPath)>=0)
// {
// UpdateNode(TreeDir.SelectedNode);
// }
//}
}
}