WPF拖拽文件(拖入拖出),监控拖拽到哪个位置,类似百度网盘拖拽
1.往wpf中拖文件
// xaml
<Grid x:Name="grid_11" DragOver="Grid_11_DragOver" Drop="Grid_11_Drop" AllowDrop="True" Background="Red"/>
// xaml.cs
/// <summary>
/// 包含目录文件判断
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
private bool HasDirectory(string[] files)
{
if (files == null)
return false;
for (int i = ; i < files.Length; i++)
{
if (System.IO.Directory.Exists(files[i]))
{
return true;
}
}
return false;
}
/// <summary>
/// 抛弃文件夹目标
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Grid_11_DragOver(object sender, DragEventArgs e)
{
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (HasDirectory(files))
{
e.Effects = DragDropEffects.None;// 抛弃这一次的拖拽源
e.Handled = true;
}
}
/// <summary>
/// 放下文件获取路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Grid_11_Drop(object sender, DragEventArgs e)
{
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files == null || HasDirectory(files))
return;
for(int i = ; i < files.Length; i++)
{
Console.WriteLine(files[i]);
}
}
2.wpf中往外拖文件
private void Button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)// 右键拖拽的时候,创建一个drop源
{
// 多文件拖拽
#region 获取拖拽的文件的个数
int fileCount = ;
#endregion FileDDWatcher.Instance.StartWatcher(fileCount);// 启动文件挪移监控,传入文件挪移的个数 #region 创建临时文件并反馈临时路径,paths挪移的目标 string dir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "TempDirectory");
if (!System.IO.Directory.Exists(dir))
{
System.IO.Directory.CreateDirectory(dir);
}
string[] paths = new string[fileCount];
for (int i = ; i < fileCount; i++)
{
string path = System.IO.Path.Combine(dir, $"fileName{i}.download");
System.IO.File.Create(path).Close();// 拖动的时候创建
paths[i] = path;
}
#endregion #region 拖拽代码 ListView lv = new ListView();
string dataFormat = DataFormats.FileDrop;
DataObject dataObject = new DataObject(dataFormat, paths);//(listview.SelectedItems.Cast<string>()).ToArray<string>());
DragDropEffects dde = DragDrop.DoDragDrop(lv, dataObject, DragDropEffects.Copy); #endregion FileDDWatcher.Instance.StopWatcher();// 停止文件监控 #region 拖拽成功之后获取目标的路径
Console.WriteLine($"dropdrag status = {dde}");
if (dde == DragDropEffects.Copy)// 拖拽成功
{
string[] ls = FileDDWatcher.Instance.GetTempFilePath();// 获取拖拽之后的目录
if (ls != null && ls.Length > )
{
for (int i = ; i < ls.Length; i++)
{
Console.WriteLine($"Target catalogue {ls[i]}");
}
}
else
{
Console.WriteLine("no file path copy");
}
}
#endregion
}
监控文件的代码
public class FileDDWatcher
{
#region property && fileds private Hashtable tempWatchers = null;
private Queue<string> pathQueue = new Queue<string>();
private int moveFileCount = ; #endregion #region instance
private static object ooo = new object();
private static FileDDWatcher _instance;
public static FileDDWatcher Instance
{
get
{
lock (ooo)
{
if (_instance == null)
{
_instance = new FileDDWatcher();
}
return _instance;
}
}
}
private FileDDWatcher() { }
#endregion #region method #region private /// <summary>
/// 文件监控触发的事件
/// </summary>
/// <returns></returns>
private void OnCreated(object source, FileSystemEventArgs e)
{
string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "TempDirectory");
if (e.FullPath.Contains(path))
{
return;
}
pathQueue.Enqueue(e.FullPath);
} #endregion #region public /// <summary>
/// 启动文件监控,传入移动文件的个数,默认是1个
/// </summary>
/// <returns></returns>
public bool StartWatcher(int fileCount = )
{
LogHelper.WriteInfo("StartWatcher");
try
{
moveFileCount = fileCount;
int i = ;
if (tempWatchers == null || tempWatchers.Count <= )
{
tempWatchers = new Hashtable();
foreach (string driveName in Directory.GetLogicalDrives())
{
if (Directory.Exists(driveName))
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Filter = "*.download";
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Created -= OnCreated;
watcher.Created += OnCreated;
watcher.IncludeSubdirectories = true;// 必须要的,监控子集目录
watcher.Path = driveName;
LogHelper.WriteInfo(driveName);
watcher.EnableRaisingEvents = true;
tempWatchers.Add("file_watcher" + i.ToString(), watcher);
i++;
}
}
}
return true;
}
catch (Exception ex)
{
LogHelper.WriteError(ex.Message);
return false;
}
}
/// <summary>
/// 停止文件监控,如果队列中路径数量和文件移动数量一致,就不重置文件传输个数
/// </summary>
/// <returns></returns>
public bool StopWatcher()
{
try
{if (tempWatchers != null && tempWatchers.Count > )
{
LogHelper.WriteInfo(tempWatchers.Count + "");
for (int i = ; i <= tempWatchers.Count; i++)
{
((FileSystemWatcher)tempWatchers["file_watcher" + i.ToString()]).Dispose();
}
tempWatchers.Clear();
tempWatchers = null;
}
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
moveFileCount = ;
}
}
/// <summary>
/// 返回文件保存的路径
/// </summary>
/// <returns></returns>
public string[] GetTempFilePath()
{
try
{
int length = pathQueue.Count;
if (length <= )
{
return new string[];
} string[] ls = new string[length];
for (int i = ; i < length; i++)
{
ls[i] = pathQueue.Dequeue();
}
return ls;
}
catch (Exception ex)
{
return new string[];
}
finally
{
moveFileCount = ;
}
}
#endregion #endregion
}
WPF拖拽文件(拖入拖出),监控拖拽到哪个位置,类似百度网盘拖拽的更多相关文章
- 打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源
前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字 ...
- 360云盘、百度云、微云……为什么不出 OS X(Mac 端)应用呢?(用户少,开发成本高)(百度网盘Mac版2016.10.18横空出世)
已经说的很好了,现有的云盘所谓的 OS X 版只有云同步功能,不过 115 是个例外,不过 115 的现状……不言自明.接下来说点和本题答案无关的,其实在官方客户端流氓 + 限速的大背景下 OS X ...
- IDM使用教程:利用IDM下载百度网盘文件
IDM是什么 其实我使用IDM下载器只是为了方便网页版百度网盘直接下载大于40M文件而已,大家知道文件过大必须打开客户端才能下载,这点对于我的破电脑感觉很烦躁,每次要等待它慢悠悠打开,然后动用我的超级 ...
- Linux命令行上传文件到百度网盘
利用bpcs_uploader你可以自动将VPS主机上的文件上传到百度网盘中,同时也可以从百度网盘中下载文件到VPS主机上,让你的文件安全地"住"在百度云中.[font=Tahom ...
- [PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索
标题起的太大了,都是骗人的.最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台.用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址.就是这么一个简单的功能,类似很多的网盘搜索类网 ...
- wget 下载百度网盘文件
上传文件到服务器,有许多种方法,罗列一下我用过的 xftps之类的工具 rz tz命令 git 上传到码云 通过wget方式,上传文件到百度网盘,七牛云等只要支持wget方式下载即可 下面介绍一下怎么 ...
- linux 从百度网盘下载文件的方法
linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...
- 在win64上使用bypy进行百度网盘文件上传
阿里云服务器的带宽为2M,网站每日的备份包都3G多了,离线下载太费时间了,打算每日将备份包自动上传到自己的百度云盘里.1.先安装Python 执行python -V ,发现没安装python2.去py ...
- 将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下)
将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下) 前面淘了一个蜗牛星际的矿机,打算拿来做个个人云盘,就装上了Linux用smb把硬盘共享出来 访问倒是很爽,就是发现下东西 ...
随机推荐
- 【技术分享:python 应用之一】如何使用 Python 对 Excel 做一份数据透视表
客户这边,其中有一张如同上图所示的数据汇总表,然而需求是,需要将这张表数据做一个数据透视表,最后通过数据透视表中的数据,填写至系统数据库.拿到需求,首先就想到肯定不能直接用设计器去操作 Excel,通 ...
- selenium+键盘鼠标
一.简单操作 1.点击(鼠标左键)页面按钮:click() 2.请空输入框:clear() 3.输入字符串:send_keys() 二.模拟键盘 模拟键盘的操作需要先导入键盘模块:from selen ...
- [design pattern](3) Dectorator
前言 很久没有写关于设计模式的博客了,实在是没有太多的精力去写.但个人觉得设计模式在我们的日常开发中还是挺重要的,它提高了软件的可维护性.因此还是有必要坚持学习设计模式,写博客主要是为了加深我对设计模 ...
- python之正则匹配match:search findall
match:从开头位置匹配,只匹配一次,开头匹配不上,则不继续匹配 a,b,\w+ match(a,"abcdef") 匹配a >>> re.match(&quo ...
- 1、安装Scrapy
一.网址:https://doc.scrapy.org/en/latest/intro/install.html 二.安装过程中出现"cl.exe"找不到的错误,解决方法:http ...
- C# 自定义集合类
.NET中提供了一种称为集合的类型,类似于数组,将一组类型化对象组合在一起,可通过遍历获取其中的每一个元素 本篇记录一个自定义集合的小实例.自定义集合需要通过实现System.Collections命 ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
在实际的开发中,建议使用连接池的形式. JNDI的资料 H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2. ...
- java 上传文件到FTP(centos中的ftp服务)
ftp服务器系统:centos7 提供ftp的服务:vsftpd pom.xml 依赖 <dependency> <groupId>commons-net</groupI ...
- C#学习基础
c#的值类型存储在栈里,而引用类型的引用存储在栈里,数据存储在堆里. c#new关键字为对象分配一个引用而非存储数据. 引用类型关键字ref: For example: Int y; void mym ...
- Burp Suite批量网页操作
1.打开md5解密网站,并输入“21232F297A57A5A743894A0E4A801FC3”,不要点击[Decrypt It!] 1.启动Burp Suite,并设置浏览器代理 3.点击[Dec ...