将本地的一个文件目录复制/移动到局域网上的其他机器上的方法
我的程序有一个需要,就是要把一个文件目录(包括其中的文件和子目录)拷贝/移动到一个局域网上的其他服务器上,使用.NET自带的类对于我的要求来说,略显复杂,我想如果使用命令行操作的话,应该很简单,几个Dos命令就能解决,因此我也想在我的程序中直接使用这些Dos命令达到目的。
具体想法是使用net use命令映射一个网络驱动器到本地,然后利用xcopy等命令像操作本地磁盘一样在本地和网络驱动器之间操作文件和目录,操作完成之后,再删掉这个网络驱动器。
这里用到了Process对象,大家想必对这个对象应该很熟悉了。
我在使用过程中主要遇到以下几个问题(为了简便,我就把Windows的命令提示符窗口,简称为Dos窗口吧,这样习惯些):
1、如何向Dos窗口发送命令:
方法是设置ProcessStartInfo对象的RedirectStandardInput为true,这同时要求设置UseShellExecute为false
2、在程序执行过程中,Dos窗口一闪而过:
显然,我们不想让这个Dos窗口被看到,方法是设置ProcessStartInfo对象的CreateNoWindow为true
3、执行的Dos命令没有效果,比如net use并没有建立起网络驱动器
试验发现,必须设置ProcessStartInfo对象的RedirectStandardOutput为true。这有点不明白,为何不重定向输出就不行呢?
4、删除网络驱动器的Dos命令看起来不起作用
我是在类的Dispose方法中删除网络驱动器,这样如果没有手工调用Dispose方法,那么在终结器中也会被调用,但是似乎在终结器调用中删除命令并没有被执行。奇怪的是,如果我在执行删除的位置设置断点的话,删除操作就能成功。后来恍然大悟,难道是因为线程/进程同步问题?因为这个删除操作是在终结器中被调用,可能执行Dos命令的进程还没有真正执行,或者还依赖于当前线程/进程的时候,就随着当前线程/进程被销毁了。具体Process类在Start之时与创建者的关系我还不清楚。突然想到,可能是和UseShellExecute=false有关?解决方法就是调用Process对象的WaitForExit方法,让当前线程等到Process退出之后再继续执行。