C#删除文件和文件夹到回收站

如果使用C#代码来删除文件或是文件夹。会将文件和文件夹直接删除,而不是删除到回收站。可以调用Microsoft.VisualBasic.dll提供的方法。 首先对项目添加名为Microsoft.VisualBasic.dll的引用,然后添加命名空间 using Microsoft.VisualBasic.FileIO; 最后示例代码如下: using System; using Microsoft.VisualBasic.FileIO; namespace leaver { class Program { static void Main(string[] args) { Console.WriteLine("删除文件到回收站"); string filepath = "leaver.txt"; FileSystem.DeleteFile(filepath, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Console.WriteLine("删除文件完成"); Console.WriteLine("删除文件夹到回收站"); string dirpath = "leaver"; FileSystem.DeleteDirectory(dirpath, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Console.WriteLine("删除文件夹完成"); } } } 很简单。。就不多说了。。

2012-09-24 · 1 min · bystander

WPF毛玻璃效果Demo和一个问题

 那天看到WPF书上讲的毛玻璃效果,就去找了下效果。。忘了例子是从哪发现得了。。先看下效果, 但是这不是重点,作者给出的代码有一个设计时错误。。错误提示为: 无法将类型为“Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance”的对象强制转换为类型“System.Windows.Window”,, 中文搜了一下。没有发现有人解决过。目测。。。然后又拿英文搜了下。几经辗转。。终于是解决了。。原文在Unable to cast XAML error。其实就是将原作者这个函数修改如下的 public static void OnIsEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { if ((bool)args.NewValue == true) { Window wnd = obj as Window; if (wnd != null) wnd.Loaded += new RoutedEventHandler(wnd_Loaded); } } 也就是验证了一下转换是否成功。 下载:修改后的RGSamples

2012-09-24 · 1 min · bystander

WPF主题分享及使用

首先是一个很流行的WPF20多种xaml主题合集源码。这个主题系列是非常漂亮的。我找到了源码。但是没有找到官网。 update:感谢月亮云的提醒,官网是:http://wpfthemes.codeplex.com 截两幅图如下: 使用很简单。一种是将WPF.Theme.dll导入。像demo展示的那样。使用其提供的主题管理类来使用。可以实现任意切换效果。另一种就是直接把源文件的各种theme.xaml提取出来,添加到资源字典就行了。当然还有一些不重要的小细节。相信你对wpf比较了解的话可以搞得定的。。还可以自己学习一下。。 昨天还看到一个主题,也比较漂亮。Amazing WPF Controls分享一下。如果有什么疑问。欢迎留言讨论。 下载:WPF20多种xaml主题合集源码

2012-09-18 · 1 min · bystander

C# 委托知识总结

如果你足够强大,你就不会把幸福押在别人身上,你会自己创造幸福或者给别人带来幸福。而变得强大的途径就是学习,就是读书,学一切东西,读任何想读的书。 爱你让我变得更强。。 继续读一些专业文章了。不保证都是原创,但是保证每篇技术文章的质量。也会注明来源,标准就是浅显易懂。但不简单。 原文来自:贺臣感谢原作者的好文章。 1.什么是委托,为什么要使用委托 我正在埋头苦写程序,突然想喝水,但是又不想自己去掉杯水而打断自己的思路,于是我就想让女朋友去给我倒水。她去给我倒水,首先我得让她知道我想让她干什么,通知她之后我可以继续写自己的程序,而倒水的工作就交给了她。这样的过程就相当于一个委托。 在程序过程中,当程序正在处理某个事件的时候,我需要另外的程序代码去辅助处理一些事情,于是委托另一个程序模块去处理,而委托就可以达到这种目的,我可以利用委托通知另外的程序模块,该去调用哪个函数方法。委托其实就起到了这样一个作用,将函数签名传递到了另一个函数中。或许这样讲还是有些模糊,看看后面的具体实例。 2.委托的定义 delegate int Add(int num1,int num2); delegate void ConvertNum(string result); 上面是定义两个委托的例子,其实很简单。声明一个委托使用delegate关键字,上面分别是定义的带返回值的委托和不带返回值的委托, 两个委托都有传递参数,当然也可以不传递参数。其实委托也是一个类,委托派生为System.MulticastDelegate,而System.MulticastDelegate 又继承System.Delegate,如果你知道这个也就明白委托其实是一个特殊的类。 委托的简单实用例子 public delegate string TeaDelegate(string spText); public class DelegateSource { public void TestDelegate() { Operator op = new Operator(); TeaDelegate tea = new TeaDelegate(op.GetTea); Console.WriteLine("去给我倒杯水"); Console.WriteLine(); string result=tea("去给我倒杯水"); Thread.Sleep(5000); Console.WriteLine(result); Console.WriteLine(); } } public class Operator { /// /// 确定是否还有水 /// private bool flag = true; public string GetTea(string spText) { if (spText == "去给我倒杯水") { if (flag) { return "老公,茶来了"; } else { return "老公,没有水了"; } } return "等待......."; } } 输出结果 上面使用最普通的一种方式来定义了一个委托的使用,这个例子虽然很简单,但是能够很形象的描述委托的使用。 3.委托的三种形式 (1).推断 推断委托例子 public delegate string TeaDelegate(string spText); public class DelegateSource { public void TestDelegate() { Operator op = new Operator(); TeaDelegate tea = op.GetTea; Console.WriteLine("去给我倒杯水"); Console.WriteLine(); string result=tea("去给我倒杯水"); Thread.Sleep(5000); Console.WriteLine(result); Console.WriteLine(); } } public class Operator { /// /// 确定是否还有水 /// private bool flag = true; public string GetTea(string spText) { if (spText == "去给我倒杯水") { if (flag) { return "老公,茶来了"; } else { return "老公,没有水了"; } } return "等待......."; } } 在委托定义的例子中我们看到委托的使用方法是在委托实例化的时候指定的[new DelegateName(FunctionName)],这里可能表述不是太但是代码应该看得白了。 而委托的推断,并没有new 委托这个步骤,而是直接将Function 指定给委托。 ...

2012-09-16 · 4 min · bystander

WCF读书笔记(4)

三种供客户端和服务端控制通信的契约介绍: 1.服务契约描述了由特定服务端点所公开的操作,每一种操作,通过参数和返回值定义请求和响应消息的格式。 2.数据契约描述了复杂类型如何被串行化为消息的一部分,数据契约是服务契约中优先用来包含复杂类型的方式。 3.消息契约提供对某个soap消息格式的控制,包括支持定制消息标题和数据契约所描述的单个消息体元素。 消息参数(Message Parameter) 对于 [OperationContract] string MyOp(string s); 若客户端传入的参数为“Hello”,则生成的请求消息体中标记为 Hello,而响应返回的消息体则被标记为返回内容,可以通过 [OperationContract] [return:MessageParameter(Name="ResponseString"] string MyOp([MessageParameter(Name="RequestString")] string s); 来定制消息中的标签。 绑定元素 实际上,每个绑定元素都会被映射到一个信道上,这样,绑定元素和信道在这个意义上可以互换。 执行上下文(OperationContext) 是System.ServiceModel命名空间的一种类型,他为服务请求提供了对执行上下文的访问,OperationContext.Current为请求在生命周期期间提供了对上下文的访问。 WCF的实例化模式 实例化控制模式服务对象被分配给请求的方式,一旦服务主机已经建立而且为每个端点创建了信道监听器,对各终端的请求已经由适当的服务对象所执行,则这些对象是基于服务类型的实例化模式的。他们是InstanceContextMode的一个枚举。 1.PerCall 服务对象为每一个对服务的调用所创建。 2.PerSession 对每一个客户端创建一个。默认是这样 3.Single 创建单一的服务对象。并由所有客户端的调用使用。 尽可能使用PerCall,大规模的部署避免PerSession并发。 WCF的四种会话 应用会话,传输会话,可靠会话,安全会话。 信道发生器取得SessionId ChannelFactory<IService> factory=new ChannelFactory<IService>("Service"); IService proxy=factory.CreateChannel(); IContextChannel obj=proxy as IContextChannel; string s=obj.SessionId;

2012-09-09 · 1 min · bystander

WCF读书笔记(3)

WCF的四大行为 契约行为(Contract Behavior),操作行为(Operation Behavior),服务行为(Service Behavior),终结点行为(Endpoint Behavior)。 如果把WCF看做是消息处理,对象激活与操作执行的管道,那么我们可以通过相应的行为来改变这个管道中某个环节的工作方式。比如加个密啊。什么的。 单向模式(One-Way) 单向模式不需要服务器执行后返回一个回复,多用于不要求服务执行后返回一个回复,并且能够容忍日志记录的失败,只有返回类型为void的才允许设置为true,同理,ref和out参数作为另一种类型的输出。也是不允许的。 WCF的三种异步操作 1.异步信道调用:客户端可以通过代理对象进行异步调用信道。 2.One-Way消息交换:单向的消息交换一旦抵达传输层,马上返回,从而实现异步 3.异步服务实现:服务端在具体实现服务操作的时候。采用异步调用的方式。 序列化: XMLSerializer序列化对象时,必须是公有,可读可写的属性,才能序列化。 WCF的四大契约 服务契约(Service Contract),数据契约(Data Contract),消息契约(Message Contract),错误契约(Fault Contract) 信道: 信道是为了便利WCF中客户端和服务的通信来设置的。ServiceHost为每个断点创建一个信道侦听器,侦听器产生通信通道,代理则产生一个信道发生器,发生器产生客户端的信道,两种信道相互兼容并且能有效处理之间的信息。 实际上,通信信道是有一个分层的信道栈组成-栈中的每一个信道都在消息处理过程中负责实施一个特定动作,信道栈包含一个传输信道,一个消息编码信道,和任意数量的消息处理信道,绑定则将决定了哪些信道留在信道栈中。当行为穿过信道栈时,消息处理方式将会有所改变。。

2012-09-08 · 1 min · bystander

WCF双工通信示例

 这两天在看WCF的书籍。就参考书上的代码写了这个例子。不得不说。书上有些错误的地方。。运行明显报错。改了一下。顺利通过。 先运行Hosting。然后运行Client。可以看到效果。不过不知道为什么会有如下的一个提示: 目标程序集不包含服务类型。可能需要调整此程序集的代码访问安全策略。 点击确定后并不影响程序运行。。但是也是个问题。。找了一下解决方法。都没有解决。。可能是我新建契约服务的时候,删掉了默认的IService配置。 //update:此问题解决了。是因为默认的app.config太多。对于典型的四层结构。需要删除契约和服务中的app.config。。 暂时先放着吧。 运行截图: 示例代码下载:Lazy.Duplex

2012-09-07 · 1 min · bystander

WCF读书笔记(2)

信道形状(Channel Shape) 用来表述不同的消息交换模式对消息交换双方信道(信息交换的管道)的不同要求,有什么IOutputChannel IReplyChannel IDuplexChannel之类的。。 对于IReplyChannel,服务器返回一个RequestContext类型,作为请求和回复之间的一道桥梁,可以获取也可以返回消息。 会话信道(Session Channel) 从状态保持的角度,信道可以分为两种类型,Datagram Channel和Session Channel,前者不和客户端绑定,后者可以识别客户端。 对于WCF的信道层来说,信道管理器在客户端和服务端扮演不同的角色。服务端的信道管理器用于监听来自客户端的请求,而客户端的信道仅仅是单纯创建用于请求发送和回复接收的信道,因此服务端的消息管理器又称为信道监听器(Channel Listener),客户端的信道管理器则称之为信道工厂(Channel Factory) 绑定元素(Binding Element) 构成一个绑定对象的元素,绑定实现了通信的所有细节,通过创建信道栈实现对消息的交换,系统绑定是指服务于某种类型场景的绑定元素的有序集合。 包括什么BaseHttpBinding之类的。 一个程序集包括元数据,中间语言代码,和资源。程序集已经加载,将一直保存在内存中,直到应用程序域卸载。最好摒弃添加服务引用的服务调用方式,而是直接将包含服务契约的程序集部署到客户端。客户端以直接创建代理的方式进行调用。 WCF可以看成是适配器,是CLR类型和XML两个不同世界的纽带。 依赖倒置原则:即抽象不应该依赖细节,细节应该依赖于抽象;即要针对接口编程,不要对实现编程。高层模块不应该依赖低层模块。两个都应该依赖抽象。 契约关心的是我能做到。而不在于我如何做到。 封送(Marshaling) 解决跨应用程序域对象访问的问题,需要采用一种特别的机制,那就是封送。分为按值封送和按引用封送 按值封送实现了跨应用程序域的数据共享 按引用封送则实现了跨应用程序域的远程调用。 如果一个程序员频繁的使用复制粘贴编程。那就意味着设计需要重构

2012-09-06 · 1 min · bystander

WCF读书笔记(1)

信道的分类:Transport Channel 信道 1.Message Encording Channel 2.Protocol Channel 信道管理器(Channel Manager),信道管理器用于信道栈的创建和生命周期的管理 1.ChannelListener 2.ChannelFactory WCF服务调用的两种典型方式 1.是借助代码生成工具svcUtil.exe导入元数据生成客户端代码和配置,添加服务引用采用的就是这种方式,工具会创建一个继承自Client的服务代理类型。 2.是通过ChannelFactory直接创建服务代理对象进行服务调用。 如果客户端已经进行了终结点的配置 那么通过信道工厂进行调用的代码大致如下: using(Channel<IService> channelFactory=new ChannelFactory<IService>("Service")) { IService ise=channelFactory.CreateChannel(); using(ise as IDisposable) { ise.MethodName(); } } WCF处理的是跨应用程序域,跨机器,跨网络的通信,所以WCF大多数时间进行网络传俗这样的IO操作,IO绑定的操作是采用异步编程(APM【Asynchronous Programming Model】) 消息交换模式MEP(Message Exchange Pattern) MEP定义了参与者进行消息交换的模板,代表一系列的模板,他们定了消息的发送者和接收者,相互进行消息传递的次序,比较典型的三种 1.Datagram 数据包模式,嘴尖的SEND/FORGET模式也叫One-Way模式,基于从一个源到另一个或多个目的地的单向消息传输,并不期待回复 消息报的发送可以分成三个模式,分别是单目的地模式,多投模式,广播模式。 依次接受方更强大。。 2.Request/Reply模式 使用最多的一种模式,请求期待回复。采用同步通信方式,但也可用于异步通信 3.Duplex 双工模式 双方可以互发消息,实现服务器回调客户端。订阅/发布是其中一种典型的实例,TCP可以提供原生的双工通信,WCF通过WSDualHttpBinding实现了基于Http的双工通信,实际上是采用两个HTTP通道实现

2012-09-05 · 1 min · bystander

SqlServer 2008开启远程连接

 对于需要外部访问数据库的操作,需要开启sql server的远程连接。没经验的我等Google之。。大部分操作按照SQL Server 2008 R2如何开启数据库的远程连接来操作 但是。有一些很小的细节需要注意。我的数据库是Sql Server 2008 Express版。这个是VS自带的。为了管理方便,可以安装SQL Server® 2008 Management Studio Express 安装过程不多说。安装完成后,直接打开 服务器名称默认是空的。。“.”好像是不行的,这时候点击右边箭头。更多,本地和远程服务器。在远程服务器里可以找到。点击就可以了。 我按照文章改完。sa还是登不上。。然后又试了一些 如上图右键sa,属性,常规里设置sa密码。不要太简单。状态里的登录选项设为启用。ok。。我碰上的问题就这几个。

2012-08-20 · 1 min · bystander