如何获取粘贴文件后的路径

lwghost 2009-03-23 09:22:50
如果源文件在C:\目录下,现在把它剪贴到D:\test\目录下,那在C#.NET里如何获取到D:\test\目录下的文件路径!
注:剪贴操作并不是在程序中去完成,而就是通过window系统的剪贴操作完成的!!
...全文
617 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
硪鑀扯蛋 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]

没有人能解答下吗?
[/Quote]

这个一般人基本回答不上来~~~高手不会公开技术~~~╮(╯▽╰)╭我自己也在找~~~希望那个牛人可以很好很好的解决一下~~~
lwghost 2009-03-26
  • 打赏
  • 举报
回复
没有人能解答下吗?
lwghost 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lovefootball 的回复:]
我觉得得拦截MoveFileEx什么的
可能会用到API拦截

你可以看下MS的Detour开发包

http://research.microsoft.com/en-us/projects/detours/
[/Quote]
能详细说明下"拦截MoveFileEx"吗?
lwghost 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 birdlonger 的回复:]
使用FileSystemWatcher , 写其Create 事件到是能监控到创建文件的路径(不过不能限制在粘贴创建的文件新建文件什么的都能响应这个事件). 如果你的使用环境下能确定只粘贴创建文件.到可以用它来监控的到粘贴后的路径.
不过也可以尝试根据它得到的路径跟GetFileDropList只用得到文件的源路径地址两个文件来进行简单的文件比较.如大小比较或者其他简单属性.如果一样就可以认为新得到的文件是从你比较的那个路径粘贴来的.这样就可以…
[/Quote]
你说的这个方法可能会在部分程度上满足我的要求,但这种方法太过于极端,不适合后期的功能扩展!谢谢了,还有没有更好的想法?
birdlonger 2009-03-24
  • 打赏
  • 举报
回复
使用FileSystemWatcher , 写其Create 事件到是能监控到创建文件的路径(不过不能限制在粘贴创建的文件新建文件什么的都能响应这个事件). 如果你的使用环境下能确定只粘贴创建文件.到可以用它来监控的到粘贴后的路径.
不过也可以尝试根据它得到的路径跟GetFileDropList只用得到文件的源路径地址两个文件来进行简单的文件比较.如大小比较或者其他简单属性.如果一样就可以认为新得到的文件是从你比较的那个路径粘贴来的.这样就可以得到 新 ,旧俩路径.
liusichen_0 2009-03-23
  • 打赏
  • 举报
回复
楼主的问题可以试一下
ClipboardProxy.ContainsFileDropList
具体用法参考MSDN,不知道里面会不会保存粘贴的路径
lwghost 2009-03-23
  • 打赏
  • 举报
回复
我不要需要获取应用程序的目录,再说你这样有对剪切操作进行监控吗?如何在剪切的时候再去得到移动文件后的路径,请看清题了再回答!
zzxap 2009-03-23
  • 打赏
  • 举报
回复
难道要说到骨子里头才会?
zzxap 2009-03-23
  • 打赏
  • 举报
回复
获取应用程序的当前工作目录。
string str = System.IO.Directory.GetCurrentDirectory();
Result: C:\xxx\xxx

这个不是已经说的很清楚了吗
lwghost 2009-03-23
  • 打赏
  • 举报
回复
有没有人帮忙解决下啊,等着急用!!
liusichen_0 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zzxap 的回复:]
C# code
1.获取和设置当前目录的完全限定路径。
string str = System.Environment.CurrentDirectory;
Result: C:\xxx\xxx

2.获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str = System.Windows.Forms.Application.StartupPath;
Result: C:\xxx\xxx

3.获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名。
string str = System.Diagnostics.Process…
[/Quote]

这个不错,收藏一下
lwghost 2009-03-23
  • 打赏
  • 举报
回复
谢谢"风语者"的回复,但清楚几点:
1.并不是要获取剪贴板里面的数据;只需要得到剪贴板里的文件最后粘贴到哪个目录下了?
2.在获取路径方面我知道怎样去获取,但现在的前提是如何去获取粘贴文件后的路径,你所提供的获取路径都是已知了文件,再去获取路径的情况,与我所需的答案还是有出入的.

请各位大侠再看清一下题,是怎样去获取粘贴文件的目录路径?前提并不知道会被粘贴到哪个目录下!!
zzxap 2009-03-23
  • 打赏
  • 举报
回复
对于Windows程序 和Web 应用程序来说,他们运行的路径是不一样的,所以关键是判断当前运行的程序是哪种程序.于是我们可以使用如下的代码

string path = "";
if (System.Environment.CurrentDirectory == AppDomain.CurrentDomain.BaseDirectory)//Windows应用程序则相等
{
path = AppDomain.CurrentDomain.BaseDirectory;
}
else
{
path = AppDomain.CurrentDomain.BaseDirectory + "Bin\";
}
这样如果我们写了一个类库,类库中用到了Assembly.LoadFrom,由于是通用类库,所以可能用到Windows程序中也可能用到Web中,那么用上面的代码就很方便了.

做法2:

string MyPath = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName);

C#获取项目程序及运行路径的方法

1.asp.net webform用“Request.PhysicalApplicationPath获取站点所在虚拟目录的物理路径,最后包含“\”;

2.c# winform用
A:“Application.StartupPath”:获取当前应用程序所在目录的路径,最后不包含“\”;
B:“Application.ExecutablePath ”:获取当前应用程序文件的路径,包含文件的名称;
C:“AppDomain.CurrentDomain.BaseDirectory”:获取当前应用程序所在目录的路径,最后包含“\”;
D:“System.Threading.Thread.GetDomain().BaseDirectory”:获取当前应用程序所在目录的路径,最后包含“\”;
E:“Environment.CurrentDirectory”:获取当前应用程序的路径,最后不包含“\”;
F:“System.IO.Directory.GetCurrentDirectory”:获取当前应用程序的路径,最后不包含“\”;

3.c# windows service服务中用“AppDomain.CurrentDomain.BaseDirectory”或“System.Threading.Thread.GetDomain().BaseDirectory”;
用“Environment.CurrentDirectory”和“System.IO.Directory.GetCurrentDirectory”将得到“ system32”目录的路径;
如果要使用“Application.StartupPath”或“Application.ExecutablePath ”,需要手动添加对“System.Windows.Forms.dll ”的引用,并在程序开头用“using System.Windows.Forms”声明该引用;

4.在卸载程序获取系统安装的目录:
System.Reflection.Assembly curPath = System.Reflection.Assembly.GetExecutingAssembly();
string path=curPath.Location;//得到安装程序类SetupLibrary文件的路径,获取这个文件路径所在的目录即得到安装程序的目录;
zzxap 2009-03-23
  • 打赏
  • 举报
回复
[code=C#]
1.获取和设置当前目录的完全限定路径。
string str = System.Environment.CurrentDirectory;
Result: C:\xxx\xxx

2.获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str = System.Windows.Forms.Application.StartupPath;
Result: C:\xxx\xxx

3.获取新的 Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名。
string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
Result: C:\xxx\xxx\xxx.exe

4.获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。
string str = System.AppDomain.CurrentDomain.BaseDirectory;
Result: C:\xxx\xxx\

5.获取应用程序的当前工作目录。
string str = System.IO.Directory.GetCurrentDirectory();
Result: C:\xxx\xxx

6.获取和设置包含该应用程序的目录的名称。
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
Result: C:\xxx\xxx\

7.获取当前进程的完整路径,包含文件名。
string str = this.GetType().Assembly.Location;
Result: C:\xxx\xxx\xxx.exe


8.获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
Result: C:\xxx\xxx\xxx.exe
[/CODE]
lwghost 2009-03-23
  • 打赏
  • 举报
回复
前面的D:\test\目录是我说的一个例子,并不是真正的路径,我这里是想得到的是CTRL+V粘贴文件后的目录路径,并不是文件的源路径,还有复制粘贴的目标都是文件,并不是字符串!
zzxap 2009-03-23
  • 打赏
  • 举报
回复
[code=C#]
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
public class Form1 : Form
{
private Button button1 ;
private Button button2 ;
private TextBox textBox1 ;
private TextBox textBox2 ;
private System.ComponentModel.Container components = null ;
public Form1 ( )
{
InitializeComponent ( ) ;
}
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}
}
base.Dispose ( disposing ) ;
}
private void InitializeComponent ( )
{
this.button1 = new Button ( ) ;
this.button2 = new Button ( ) ;
this.textBox1 = new TextBox () ;
this.textBox2 = new TextBox ( ) ;
this.SuspendLayout ( ) ;
this.button1.Location = new System.Drawing.Point ( 264 , 56 ) ;
this.button1.Size = new System.Drawing.Size ( 96 , 40 ) ;
this.button1.Name = "button1" ;
this.button1.TabIndex = 0 ;
this.button1.Text = "拷贝指定的数据到剪切板" ;
this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
this.button2.Location = new System.Drawing.Point ( 264 , 104 ) ;
this.button2.Size = new System.Drawing.Size ( 96 , 40 ) ;
this.button2.Name = "button2" ;
this.button2.TabIndex = 1 ;
this.button2.Text = "从当前剪切板获得数据" ;
this.button2.Click += new System.EventHandler ( this.button2_Click ) ;
this.textBox1.Location = new System.Drawing.Point ( 64 , 64 ) ;
this.textBox1.Name = "textBox1" ;
this.textBox1.TabIndex = 2 ;
this.textBox1.Text = "" ;
this.textBox2.Location = new System.Drawing.Point ( 64 , 104 ) ;
this.textBox2.Name = "textBox2" ;
this.textBox2.TabIndex = 3 ;
this.textBox2.Text = "" ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
this.ClientSize = new System.Drawing.Size ( 384 , 273 ) ;
this.Controls.Add ( textBox2 ) ;
this.Controls.Add ( textBox1 ) ;
this.Controls.Add ( button2 ) ;
this.Controls.Add ( button1 ) ;
this.Name = "Form1" ;
this.Text = "Visual C#来操作Clipboard!" ;
this.ResumeLayout ( false ) ;
}
static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
private void button1_Click ( object sender , System.EventArgs e )
{
if ( textBox1.SelectedText != "" )
Clipboard.SetDataObject ( textBox1.SelectedText ) ;
else
textBox2.Text = "在textBox1中没有选定的内容";
}
private void button2_Click ( object sender , System.EventArgs e )
{
IDataObject iData = Clipboard.GetDataObject ( ) ;
//检测数据是否是可以使用的格式,即文本格式
if ( iData.GetDataPresent ( DataFormats.Text ) )
{
//是可以使用的格式,就在textbox2中显示剪切板中的内容
textBox2.Text = ( String ) iData.GetData ( DataFormats.Text ) ;
}
else
{
//如果不是
textBox2.Text = "没有从剪切板中接收到数据!" ;
}
}
}
[/CODE]
zzxap 2009-03-23
  • 打赏
  • 举报
回复
if ( textBox1.SelectedText != "" )
Clipboard.SetDataObject ( textBox1.SelectedText ) ;
else
textBox2.Text = "在textBox1中没有选定的内容" ;
(2).把读取剪切板中的数据,并显示出来。
要实现本步骤,也需要解决好二个问题:其一,在剪切板中不仅可以存放文本,还可以存放其他类型的数据,而TextBox2能够显示出来的数据类型只有文本,所以为了程序有更好的稳定性,在显示之前,要判断当前剪切板中的数据类型是文本,其二,读取剪切板中的数据,并显示出来。
I > .判断当前剪切板中的数据类型:
判断剪切板中的数据类型,要使用到IdataObject接口,此接口的可以存放从剪切板中读取得数据。通过IdataObject接口的方法GetDataPresent()来判断是否为符合自己需要的数据类型。
II >.读取剪切板中的数据,并显示出来:
通过Clipboard类的GetDataObject()可以把当前剪切板中的数据存放到IdataObject接口中,但IdataObject接口这地数据不能直接被程序使用,必须通过IdataObject接口的GetData()获得数据。但由于GetData()地返回值是一个Object类型变量,即参考类型变量,而TextBox1显示的文本是实值类型变量,所以还要进行一次出箱的操作,这种操作在前面的文章已经比较详细的介绍过了,这里就不加叙述了。经过出箱操作后的数据就可以被TextBox1使用了。下面是解决上面二个问题的代码:
IDataObject iData = Clipboard.GetDataObject ( ) ;
//检测数据是否是可以使用的格式,即文本格式
if ( iData.GetDataPresent ( DataFormats.Text ) )
{
//是可以使用的格式,就在textbox2中显示剪切板中的内容
textBox2.Text = ( String ) iData.GetData ( DataFormats.Text ) ;
}
else
{
//如果不是
textBox2.Text = "没有从剪切板中接收到数据!" ;
}
dyshadow 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Guyschaos 的回复:]
引用楼主 lwghost 的帖子:
那在C#.NET里如何获取到D:\test\目录下的文件路径!

你不都知道路径了嘛!那还获取什么?这句话我还真不太理解!
你直接掉move命令好了!
[/Quote]


LZ似乎是要做个剪贴板中的信息,得到CTRL+C之后文件的路径,再进行操作。

剪贴板中的信息是有类型的,string类型是无法接受bitmap类型数据。

具体没有实现过,不过感觉上是应该找个文件系统移动的类型进行操作。
justindreams 2009-03-23
  • 打赏
  • 举报
回复
ClipBoard
wuyi8808 2009-03-23
  • 打赏
  • 举报
回复
监视系统剪贴板。
加载更多回复(7)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧